: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が働いています。両方のコンパイラでこのように動作するように、コードをリファクタリングする方法はありますか?
通常、VSとgccが異なる場合、gccは正しいです。 –
これは、Visual C++プリプロセッサの既知のバグです。再スキャンする前にマクロを展開しません。 gccの動作は正しいです。 –
すべての回答をいただきありがとうございます...提示された解決策に関して、私は私の例をあまりにも単純化して、働かせることができなかったと思います。私は別の回避策を見つけましたが、この一般的な問題の例ではありませんのでここでは省略します。 – user109078