宏中的附加逗号

时间:2012-08-26 14:40:26

标签: c++ c

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, )

1 个答案:

答案 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

  

如果宏定义中的标识符列表没有以省略号结尾,则在调用类函数宏时,参数的数量(包括那些不包含预处理标记的参数)应等于参数的数量。宏定义。否则,调用中的参数应该多于宏定义中的参数(不包括...)。 ...