麻烦__VA_ARGS__

时间:2011-01-07 22:55:16

标签: 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)

我在各种没有输入的宏中尝试使用和不使用()

2 个答案:

答案 0 :(得分:1)

__VA_ARGS__是C99创新,不属于C ++标准。各种编译器可能会选择支持它,但它不是技术上合法的C ++代码。这可能是您遇到的一些问题的原因。

答案 1 :(得分:1)

我认为您的宏没有任何问题。

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

这是a reported bug in Visual C++