2016-10-13 10 views
0

現在、私は私が書いていない、次のマクロを使用するVisual Studioの2015のService Pack 2でいくつかのコードをコンパイルしようとしている:Visual Studioの可変引数マクロ展開利回り予想外の結果

#define REM(...) __VA_ARGS__ 
#define EAT(...) 

// Retrieve the type 
#define TYPEOF(x) DETAIL_TYPEOF(DETAIL_TYPEOF_PROBE x,) 
#define DETAIL_TYPEOF(...) DETAIL_TYPEOF_HEAD(__VA_ARGS__) 
#define DETAIL_TYPEOF_HEAD(x , ...) REM x 
#define DETAIL_TYPEOF_PROBE(...) (__VA_ARGS__), 
// Strip off the type 
#define STRIP(x) EAT x 
// Show the type without parenthesis 
#define PAIR(x) REM x 

たぶんTYPEOFマクロを式の型を分離します。 私は、次の呼び出しでTYPEOFマクロを呼び出すために試してみました:理論的には

TYPEOF((int) m) c; 

、結果は

int型のCでなければなりません。

代わりにプリプロセッサ出力

int、m、c;

#define DETAIL_TYPEOF_HEAD(x , ...) X = x and VA_ARGS = __VA_ARGS__ 

#define DETAIL_TYPEOF_HEAD(x, ...) REM x 

を交換

この出力が得られる:

X =(INT)、M、及びVA_ARGS = Cを、

DETAIL_TYPEOF_HEADマクロを入力すると、variadicパラメータリストから最初のエントリxを選択することができず、その代わりにリスト全体がxになります。

あなたはこの現象を知っていますか?

よろしく

+2

私はこれまでにこの現象に遭遇したと思います。 * Microsoftコンパイラ*と呼ばれています。 –

+1

@ n.m。私は通常建設的ではないとフラグを立てるだろうが、この場合はおそらく正しいだろう。 http://stackoverflow.com/questions/9183993/msvc-variadic-macro-expansion – lcs

+0

@lcsよく私は少し冗談コメントをここに残すことが大好きですが、私は利用可能なすべての主要なコンパイラと標準のテキスト。 –

答えて

0

[OK]を、私はどのように正確に分からないが、これは予想される結果を与えるようだ:

// Retrieve the type 
#define DETAIL_TYPEOF_HEAD_(x , ...) REM x 
#define DETAIL_TYPEOF_HEAD(args) DETAIL_TYPEOF_HEAD_ args 
#define DETAIL_TYPEOF_PROBE(...) (__VA_ARGS__), 
#define DETAIL_TYPEOF(...) DETAIL_TYPEOF_HEAD((__VA_ARGS__)) 
#define TYPEOF(x) DETAIL_TYPEOF(DETAIL_TYPEOF_PROBE x,) 

は括弧の追加を大いに役立つように見えました。

関連する問題