Optional Parameters with C++ Macros
为什么此主题中的某条消息的作者在宏中使用了额外的逗号?
#define PRINT_STRING_MACRO_CHOOSER(...) \
GET_4TH_ARG(__VA_ARGS__, PRINT_STRING_3_ARGS, \
PRINT_STRING_2_ARGS, PRINT_STRING_1_ARGS, )
答案 0 :(得分:5)
这样做是为了GET_4TH_ARG
将始终提供其vararg参数(这是语言的要求)。
例如,没有它,
PRINT_STRING_MACRO_CHOOSER("Hello, World")
将扩展为
GET_4TH_ARG("Hello, World", PRINT_STRING_3_ARGS, PRINT_STRING_2_ARGS, PRINT_STRING_1_ARGS)
而不是
GET_4TH_ARG("Hello, World", PRINT_STRING_3_ARGS, PRINT_STRING_2_ARGS, PRINT_STRING_1_ARGS,)
第一个表单不提供任何vararg参数(因此不会是有效的调用),其中第二个表单确实为GET_4TH_ARG
提供了一个空的vararg参数。
来自C ++标准:[cpp.replace]/4
:
如果宏定义中的标识符列表没有以省略号结尾,则在调用类函数宏时,参数的数量(包括那些不包含预处理标记的参数)应等于参数的数量。宏定义。否则,调用中的参数应该多于宏定义中的参数(不包括...)。 ...