为什么此线程中的其中一条消息的作者在此处的宏中使用附加逗号?
#define PRINT_STRING_MACRO_CHOOSER(...) \
GET_4TH_ARG(__VA_ARGS__, PRINT_STRING_3_ARGS, \
PRINT_STRING_2_ARGS, PRINT_STRING_1_ARGS, )
为什么此线程中的其中一条消息的作者在此处的宏中使用附加逗号?
#define PRINT_STRING_MACRO_CHOOSER(...) \
GET_4TH_ARG(__VA_ARGS__, PRINT_STRING_3_ARGS, \
PRINT_STRING_2_ARGS, PRINT_STRING_1_ARGS, )
这样做是为了GET_4TH_ARG
始终提供其可变参数(这是语言的要求)。
例如,没有它,
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,)
第一种形式不提供任何可变参数(因此不会是有效的调用),而第二种形式确实为GET_4TH_ARG
.
来自 C++ 标准[cpp.replace]/4
:
如果宏定义中的标识符列表不以省略号结尾,则调用类函数宏时的参数数量(包括那些不包含预处理标记的参数)应等于宏定义中的参数数量。否则,调用中的参数应该多于宏定义中的参数(不包括...)。...