このスレッドのメッセージの1つの作成者が、ここのマクロで追加のコンマを使用しているのはなぜですか?
#define PRINT_STRING_MACRO_CHOOSER(...) \
GET_4TH_ARG(__VA_ARGS__, PRINT_STRING_3_ARGS, \
PRINT_STRING_2_ARGS, PRINT_STRING_1_ARGS, )
このスレッドのメッセージの1つの作成者が、ここのマクロで追加のコンマを使用しているのはなぜですか?
#define PRINT_STRING_MACRO_CHOOSER(...) \
GET_4TH_ARG(__VA_ARGS__, PRINT_STRING_3_ARGS, \
PRINT_STRING_2_ARGS, PRINT_STRING_1_ARGS, )
これは、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 引数を提供しません (そのため、有効な呼び出しではありません)。2 番目の形式は に空の vararg 引数を提供しますGET_4TH_ARG
。
C++ 標準から: [cpp.replace]/4
:
マクロ定義の識別子リストが省略記号で終わらない場合、関数のようなマクロの呼び出しにおける引数の数 (前処理トークンを含まない引数を含む) は、マクロ定義のパラメーターの数と等しくなければなりません。それ以外の場合、呼び出しには、マクロ定義のパラメーターよりも多くの引数が必要です (... を除く)。...