1

C++ 预处理器 __VA_ARGS__ 参数数量

那里接受的答案对我不起作用。我已经尝试过使用 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_Nand much less 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)

我已经()在各种不需要输入的宏中尝试了使用和不使用。

4

2 回答 2

1

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

于 2011-01-07T23:29:07.250 回答
1

我看不出你的宏有什么问题。

同时使用 g++ 4.5.1(在 C++0x 模式下)和 mcpp,ARG_N_( XXX )正确替换为1.

这是Visual C++ 中报告的错误

于 2011-01-07T23:34:13.963 回答