这是因为按照 C 语言标准(C99以上),空的宏参数不会被省略,所以
#define ARGS_NUM(...) ARGS_COUNT(placeholder, ## __VA_ARGS__, 4, 3, 2, 1, 0)
在没有给定参数时,会展开为
ARGS_COUNT(placeholder, , 4, 3, 2, 1, 0)
正是为了解决这一问题,GNU CPP 才特别引入了 “## __VA_ARGS__” 这种语法。它会在 __VA_ARGS__ 为空时省略前一个逗号,详见
https://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html
因此,使用 GNU 扩展以后,ARGS_NUM 在没有参数时会展开为
ARGS_COUNT(placeholder, 4, 3, 2, 1, 0)
比标准 C 少一个逗号,也就少一个参数。
当你指定了 c11 标准以后,GNU 扩展被关闭,主楼代码就会因为多出的逗号而出现编译错误。
C 标准没有提供解决这一问题的办法,但是这个 SO 贴子的回复里提供了一些解决方案:
https://stackoverflow.com/questions/2124339/c-preprocessor-va-args-number-of-arguments
【 在 haman2013 的大作中提到: 】
: 当__VA_ARGS__为空时,总是算不对,请大家帮忙想想有什么办法
:
:
--
FROM 171.43.221.*