c++ - __VA_ARGS__ 有问题

标签 c++ c-preprocessor variadic-macros

C++ preprocessor __VA_ARGS__ number of arguments

那里接受的答案对我不起作用。我试过 MSVC++ 10 和 g++ 3.4.5。

我还将示例压缩成更小的部分,并开始尝试在错误中打印出一些信息给我:

template < typename T >
struct print;

#include <boost/mpl/vector_c.hpp>

#define RSEQ_N 10,9,8,7,6,5,4,3,2,1,0
#define ARG_N(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,N,...) N
#define ARG_N_(...) ARG_N(__VA_ARGS__)

#define XXX 5,RSEQ_N

#include <iostream>
int main()
{
  print< boost::mpl::vector_c<int, ARG_N_( XXX ) > > g; // ARG_N doesn't work either.
}

在我看来,ARG_N 的参数最终变成了“XXX”,而不是 5,RSEQ_N,更不用说 5,10,...,0。 g++ 的错误输出更具体地说只提供了一个参数。

很难相信答案会被提出,然后在它完全不起作用时被接受,所以我做错了什么?为什么 XXX 被解释为参数而不被扩展?在我自己的困惑中,一切正常,直到我尝试将 VA_ARGS 传递给包含一些名称后跟......的宏,如下所示:

#define WTF(X,Y,...) X , Y , __VA_ARGS__
#define WOT(...) WTF(__VA_ARGS__)

WOT(52,2,5,2,2)

我已经尝试在各种不接受输入的宏中使用和不使用 ()

最佳答案

__VA_ARGS__ 最初是在 C99 中引入的,在 C++11 之前不是 C++ 标准的一部分。您在此处引用的编译器不支持 C++11(我相信),但更现代的编译器应该能够很好地处理这个问题。

关于c++ - __VA_ARGS__ 有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4631038/

相关文章:

c++ - 如何在 Ubuntu 20.04 上安装 libstdc++6 调试符号?

c++ - 对现有的 C 侵入式链表施加类型安全

c - 替代#define 以获得 C 中的灵活性

c++ - 向可变参数宏添加默认参数

c++ - ISO C++ 的带有零参数的可变参数宏

c++ - 如何在 C++ 中解析具有不同字段数的行

c++ - 视觉 C++ :error C2664: 'ReleaseDC' : cannot convert parameter 1 from 'HDC' to 'HWND'

c - 如何在 C 中使用预处理器执行/跳过某些代码行?

c - #define 中的方括号

c - 输出由 `||` 分隔的参数的 Variadic 宏