2012-08-26 39 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

如果標識符列表中的宏定義不與省略號結束,參數的數目(包括由無預處理標記的那些參數)的一個調用的類似宏的宏應該等於宏定義中的參數個數。否則,調用中的參數應該多於宏定義中的參數(不包括...)。 ...