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' ではなく 'XXX' になってしまうように私には思え5,RSEQ_Nます5,10,...,0。g++ のエラー出力は、より具体的には、引数が 1 つしか指定されていないことを示しています。

答えが提案され、それが完全に機能しないときに受け入れられると信じるのに苦労しているので、何が間違っているのでしょうか? 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 に答える