通过__VA_OPT__的递归宏

时间:2018-07-04 05:14:06

标签: c++ preprocessor c++20

使用__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+个参数。

1 个答案:

答案 0 :(得分:2)

答案是肯定的!如果您已经可以have recursive macros in C,您可以在 C++20 中实现,__VA_OPT__ 使某些事情变得更好。

以下是您可以执行的 an example (with explanation) 操作:定义一个 FOR_EACH 宏,该宏将宏应用于一堆参数,并且比您在 {{1} 之前必须做的可怕事情要好得多}:

__VA_OPT__