4

C++ 宏的可选参数

为什么此线程中的其中一条消息的作者在此处的宏中使用附加逗号?

#define PRINT_STRING_MACRO_CHOOSER(...) \
    GET_4TH_ARG(__VA_ARGS__, PRINT_STRING_3_ARGS, \
                PRINT_STRING_2_ARGS, PRINT_STRING_1_ARGS, )
4

1 回答 1

5

这样做是为了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

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

于 2012-08-26T14:49:51.203 回答