怎样设置自己的网站深圳seo专家
文章目录
- 功能说明
- 实现
- 示例
- 解析
- 扩展
功能说明
宏检验条件是否成立,并返回指定的值
#define TU_VERIFY(...) _GET_3RD_ARG(__VA_ARGS__, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)(__VA_ARGS__)
- TU_VERIFY(1) 检验为
真
,啥也不干 - TU_VERIFY(0) 校验为
假
,函数返回,返回值为false
- TU_VERIFY(87, 1) 检验为
真
,啥也不干 - TU_VERIFY(0, 100) 检验为
假
,函数返回,返回值为100
实现
// Helper to implement optional parameter for TU_VERIFY Macro family
#define _GET_3RD_ARG(arg1, arg2, arg3, ...) arg3
#define _GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4/*------------- Generator for TU_VERIFY and TU_VERIFY_HDLR -------------*/
#define TU_VERIFY_DEFINE(_cond, _handler, _ret) do \
{ \if ( !(_cond) ) { _handler; return _ret; } \
} while(0)/*------------------------------------------------------------------*/
/* TU_VERIFY* - TU_VERIFY_1ARGS : return false if failed* - TU_VERIFY_2ARGS : return provided value if failed*------------------------------------------------------------------*/
#define TU_VERIFY_1ARGS(_cond) TU_VERIFY_DEFINE(_cond, , false)
#define TU_VERIFY_2ARGS(_cond, _ret) TU_VERIFY_DEFINE(_cond, , _ret)#define TU_VERIFY(...) _GET_3RD_ARG(__VA_ARGS__, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)(__VA_ARGS__)
示例
#include <stdio.h>
#include <stdbool.h>// Helper to implement optional parameter for TU_VERIFY Macro family
#define _GET_3RD_ARG(arg1, arg2, arg3, ...) arg3
#define _GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4/*------------- Generator for TU_VERIFY and TU_VERIFY_HDLR -------------*/
#define TU_VERIFY_DEFINE(_cond, _handler, _ret) \do \{ \if (!(_cond)) \{ \_handler; \return _ret; \} \} while (0)/*------------------------------------------------------------------*/
/* TU_VERIFY* - TU_VERIFY_1ARGS : return false if failed* - TU_VERIFY_2ARGS : return provided value if failed*------------------------------------------------------------------*/
#define TU_VERIFY_1ARGS(_cond) TU_VERIFY_DEFINE(_cond, , false)
#define TU_VERIFY_2ARGS(_cond, _ret) TU_VERIFY_DEFINE(_cond, , _ret)#define TU_VERIFY(...) _GET_3RD_ARG(__VA_ARGS__, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)(__VA_ARGS__)static int verify_func(int cond, int value)
{TU_VERIFY(cond, value);return 0xa5;
}int main(int argc, char *argv[])
{printf("%x \r\n", verify_func(87, 1));printf("%x \r\n", verify_func(0, 100));return 0;
}
结果打印
a5
64
解析
- 该宏最少传入一个参数,最多传入两个参数
__VA_ARGS__
可以理解为占位符,当只有一个参数时,该宏展开为_GET_3RD_ARG(xxx, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)
得到的就是TU_VERIFY_1ARGS
,所以执行的就是TU_VERIFY_1ARGS(xxx)
- 当有两个参数时,该宏展开为
_GET_3RD_ARG(xxx, yyy, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)
得到的就是TU_VERIFY_2ARGS
,所以执行的就是TU_VERIFY_2ARGS(xxx, yyy)
扩展
带 handler
处理的功能
/*------------------------------------------------------------------*/
/* TU_VERIFY WITH HANDLER* - TU_VERIFY_HDLR_2ARGS : execute handler, return false if failed* - TU_VERIFY_HDLR_3ARGS : execute handler, return provided error if failed*------------------------------------------------------------------*/
#define TU_VERIFY_HDLR_2ARGS(_cond, _handler) TU_VERIFY_DEFINE(_cond, _handler, false)
#define TU_VERIFY_HDLR_3ARGS(_cond, _handler, _ret) TU_VERIFY_DEFINE(_cond, _handler, _ret)#define TU_VERIFY_HDLR(...) _GET_4TH_ARG(__VA_ARGS__, TU_VERIFY_HDLR_3ARGS, TU_VERIFY_HDLR_2ARGS,UNUSED)(__VA_ARGS__)
- 该宏最少传入两个参数,最多传入三个参数
__VA_ARGS__
可以理解为占位符,当只有一个参数时,该宏展开为_GET_4TH_ARG(xxx, yyy, TU_VERIFY_HDLR_3ARGS, TU_VERIFY_HDLR_2ARGS, UNUSED)
得到的就是TU_VERIFY_HDLR_2ARGS
,所以执行的就是TU_VERIFY_HDLR_2ARGS(xxx, yyy)
- 当有三个参数时,该宏展开为
_GET_4TH_ARG(xxx, yyy, zzz, TU_VERIFY_HDLR_3ARGS, TU_VERIFY_HDLR_2ARGS, UNUSED)
得到的就是TU_VERIFY_HDLR_3ARGS
,所以执行的就是TU_VERIFY_HDLR_3ARGS(xxx, yyy, zzz)