2012-10-18 9 views
5

GCC対のVisual Studioマクロ展開次のコード与え

void doSomething(int one, int two, int three) 
{ 
    //something here 
} 

#define ONE 1,2,3 

#define TWO(arg) doSomething(arg); 

#define THREE(arg) TWO(arg) 

void doSomethingElse() 
{ 
    TWO(ONE) 

    THREE(ONE) 
} 

のVisual Studio 2010は、次のプリプロセッサ出力(いくつかの空白行を省略)を有している:

void doSomething(int one, int two, int three) 
{ 

}  

void doSomethingElse() 
{ 
    doSomething(1,2,3); 

    doSomething(1,2,3);  
} 

GCC 4.2は、以下を提供しながら、 :

void doSomething(int one, int two, int three) 
{ 

}  

void doSomethingElse() 
{ 
    doSomething(1,2,3); 

myFile.cpp:17:13: error: macro "TWO" passed 3 arguments, but takes just 1 
    TWO 
} 

私はどちらが標準であるか分かりませんが、私は視覚的なスタッドのように動作したいですioが働いています。両方のコンパイラでこのように動作するように、コードをリファクタリングする方法はありますか?

+1

通常、VSとgccが異なる場合、gccは正しいです。 –

+0

これは、Visual C++プリプロセッサの既知のバグです。再スキャンする前にマクロを展開しません。 gccの動作は正しいです。 –

+0

すべての回答をいただきありがとうございます...提示された解決策に関して、私は私の例をあまりにも単純化して、働かせることができなかったと思います。私は別の回避策を見つけましたが、この一般的な問題の例ではありませんのでここでは省略します。 – user109078

答えて

1

カンマは、別のマクロで使用する場合は特別な処理が必要です。

これは動作するはずです:

#define ONE() 1,2,3 
#define TWO(ARG) doSomething(ARG()); 
#define THR(ARG) TWO(ARG) 

あなたはマクロそのもののような機能にそれを回すことにより、速やかに交換されているONEを遅らせます。

boost documentation siteBOOST_PP_COMMA_IFでこれを回避する例をもっと見ることができます。

3

それは置換で3つの引数にならないように別の可能性は、引数を括弧で囲むことになります。

#define ONE 1,2,3                                                                
#define TWO_PARENS(arg) doSomething arg;                                                          
#define TWO(arg) TWO_PARENS((arg));                                                           
#define THREE(arg) TWO_PARENS((arg)) 
THREE(ONE)   

はBTW GCCは仕様に応じて権利です。

関連する問題