で再帰マクロを書くことは合法__VA_OPT__
ですか?
GCC と Clang は再帰的に置き換えられないように見えますが、それが意図的なものかどうかはわかりません (__VA_OPT__
サポートはごく最近のことです)。
C++ 仕様 (§19.3.1/3:
__VA_OPT__
):それ以外の場合、置換は、再スキャンとさらなる置換の前に、現在の関数のようなマクロの置換リストとしてのコンテンツの展開の結果で構成されます
上記の強調表示されたセクションは、再帰が不可能であることを意味しますか?
たとえば、可変長マクロ パラメーターのリストを追加するには、次のようにします。
#define RECURSE(mFIRST, ...) + mFIRST __VA_OPT__(RECURSE(__VA_ARGS__))
int main(int argc, char const* const argv[])
{
return 1 RECURSE(2, 3, 4);
// Expected result: "return 1 + 2 + 3 + 4;"
}
GCC と Clang はどちらもRECURSE
、後処理で生成されます。
// NOTE: Below is the output from g++ -E
int main(int argc, char const* const argv[])
{
return 1 + 2 RECURSE(3, 4);
}
注: これが可能であれば、連結などのより複雑な可変個引数マクロをかなり簡単に記述できます。これは、カスタム__VA_NO_OPT__
fromを作成できるため__VA_OPT__
です。これにより、1 および 2+ パラメータに対して完全に別個のコードを提供できます。