用 编写递归宏是否合法__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+ 参数提供完全独立的代码。