Som*_*ame 2 c macros variadic-macros
我试图理解C预处理宏中的参数计数和这个答案中的想法.我们有以下宏(为了简单起见,我更改了参数的数量):
#define HAS_ARGS(...) HAS_ARGS_(__VA_ARGS__, 1, 1, 0,)
#define HAS_ARGS_(a, b, c, N, ...) N
Run Code Online (Sandbox Code Playgroud)
据我所知,这个宏的目的是检查给定的varargs是否为空.所以在空的varargs上,宏调用被替换为0似乎很好.但是只有一个参数,它也会变成0,我觉得很奇怪.
HAS_ARGS(); //0
HAS_ARGS(123); //also 0
HAS_ARGS(1, 2); //1
Run Code Online (Sandbox Code Playgroud)
我想我明白了原因.如果空的varargs a被替换为空的预处理令牌,则在单个参数的情况下,vararg将被替换为产生相同结果的参数.
有没有办法0在varargs为空的情况下返回,1如果参数号从1到HAS_ARGS_宏调用中的定义,而不使用逗号吞咽或其他不符合的技巧.我的意思是
SOME_MACRO_F() //0
SOME_MACRO_F(234) //1
SOME_MACRO_F(123, 132) //1
//etc
Run Code Online (Sandbox Code Playgroud)
你不能传递零参数HAS_ARGS(...).ISO C(和C++,至少在接下来的两年中)要求省略号对应于最后一个命名之后的至少一个附加参数.
如果没有命名的,那么宏需要传递至少一个参数.在HAS_ARGS()额外参数的情况下,它只是一个空令牌序列.零参数根本不可能.
这正是答案中的用例.目标宏至少需要一个参数.所以我们可以使用一个包装器只接受省略号来实现"重载分辨率".一个更好的名字可能就是这样HAS_MORE_THAN_1_ARGS.因为这就是谓词告诉你的意思.唉,我赞成简洁回答.