2012-08-26 21 views
4

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

回答

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

第一架F orm不提供任何可变参数(因此不会成为有效的调用),其中第二种形式的确提供了一个空的可变参数给GET_4TH_ARG

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

如果标识符列表中的宏定义不与省略号结束,参数的数目(包括由无预处理标记的那些参数)的一个调用的类似宏的宏应该等于宏定义中的参数个数。否则,调用中的参数应该多于宏定义中的参数(不包括...)。 ...