【发布时间】:2017-08-20 22:11:09
【问题描述】:
所以,基本上我正在尝试实现一个宏来计算 VA_ARGS 中的参数数量。
为简单起见,它最多只能使用 3 个参数。问题是当宏使用少于3个参数时,它不起作用,并触发“expected an expression”错误。
#define EXPAND( x ) x
#define PP_NARG(...) EXPAND(PP_ARG_N(__VA_ARGS__, PP_RSEQ_N()))
#define PP_ARG_N(_1, _2, _3, N,...) N
#define PP_RSEQ_N() 3,2,1,0
void main()
{
printf("\nTEST PP_NARG: %i", PP_NARG()); //Doesn't work (in this case it shouldn't work, so it's correct)
printf("\nTEST PP_NARG: %i", PP_NARG(0)); //Doesn't work
printf("\nTEST PP_NARG: %i", PP_NARG(0,0)); //Doesn't work
printf("\nTEST PP_NARG: %i", PP_NARG(0,0,0)); //Works
}
只保留可以正确编译并打印“TEST PP_NARG: 3”的行。
我认为问题可能在于 PP_RSEQ_N() 仅扩展为“3”,而不是“3,2,1,0”,因为即使 PP_RSEQ_N() 被定义为这样
#define PP_RSEQ_N() 10,9,8,7,6,5,4,3,2,1,0
它仍然不能使用少于 3 个参数。
我正在使用 MSVC 编译器,这可能是导致问题的原因,因为它在使用宏时表现不佳,如下所示:MSVC doesn't expand __VA_ARGS__ correctly
【问题讨论】:
-
经典宏滥用示例。
-
#define PP_ARG_N2(...) PP_ARG_N(__VA_ARGS__)?
标签: c++ visual-c++ macros variadic-macros