宏中的附加逗号

Fro*_*art 4 c c++

带有C++宏的可选参数

为什么此线程中的一条消息的作者在宏中使用了额外的逗号?

#define PRINT_STRING_MACRO_CHOOSER(...) \
    GET_4TH_ARG(__VA_ARGS__, PRINT_STRING_3_ARGS, \
                PRINT_STRING_2_ARGS, PRINT_STRING_1_ARGS, )
Run Code Online (Sandbox Code Playgroud)

Man*_*rse 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参数(因此不会是有效的调用),其中第二种形式确实提供了一个空的vararg参数GET_4TH_ARG.

从C++标准[cpp.replace]/4:

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