使用__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__
创建自定义__VA_OPT__
,从而可以为1和2+个参数。
答案 0 :(得分:2)
答案是肯定的!如果您已经可以have recursive macros in C,您可以在 C++20 中实现,__VA_OPT__
使某些事情变得更好。
以下是您可以执行的 an example (with explanation) 操作:定义一个 FOR_EACH
宏,该宏将宏应用于一堆参数,并且比您在 {{1} 之前必须做的可怕事情要好得多}:
__VA_OPT__