4

C++マクロのオプションパラメータ

このスレッドのメッセージの1つの作成者が、ここのマクロで追加のコンマを使用しているのはなぜですか?

#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常に 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:

マクロ定義の識別子リストが省略記号で終わらない場合、関数のようなマクロの呼び出しにおける引数の数 (前処理トークンを含まない引数を含む) は、マクロ定義のパラメーターの数と等しくなければなりません。それ以外の場合、呼び出しには、マクロ定義のパラメーターよりも多くの引数が必要です (... を除く)。...

于 2012-08-26T14:49:51.203 に答える