可変個引数に引数を指定せずに可変個引数マクロを呼び出すことは合法M
ですか?
関連する標準引用符は[cpp.replace]/4です:
マクロ定義の識別子リストが省略記号で終わらない場合、関数のようなマクロの呼び出しにおける引数の数 (前処理トークンを含まない引数を含む) は、マクロ定義のパラメーターの数と等しくなければなりません。それ以外の場合、呼び出しには、マクロ定義のパラメーターよりも多くの引数が必要です ( を除く
...
)。)
呼び出しを終了する前処理トークンが存在する必要があります。
非可変長パラメーターがない場合M()
、呼び出しには 1 つの引数 (前処理トークンで構成されていない) があるため、フォーム内の呼び出しは正当である必要があります。したがって、非可変引数よりも引数が 1 つ多くなります。
非可変引数が 1 つの場合、可変引数の前処理トークンを含まない引数を導入するために末尾,
に as を付ける必要がありますか? M(1,)
それ以外の場合、引数の数は非可変引数の数と等しくなります。つまり、
#define variadic(x,...) #__VA_ARGS__
variadic(1,) // 2 arguments: ok
variadic(1) // 1 argument: wrong?
ただし、 ClangとGCCはどちらも次のテスト ケースを受け入れます。
#include <iostream>
#define variadic(x,...) #__VA_ARGS__
int main()
{
std::cout << "'" variadic(1) "'" << std::endl;
}
そして出力として生成します:
''
これは標準外の動作ですか?