2009-06-11 20 views
1

なぜこれはVC 2005でコンパイルされませんか?プリプロセッサだけで出力を介してこれを実行するマルチパラメータ関数をマクロに渡す

bool isTrue(bool, bool) { return true; } 

void foo(); 

#define DO_IF(condition, ...) if (condition) foo(__VA_ARGS__);   

void run() 
{ 
    DO_IF(isTrue(true, true)); // error C2143: syntax error : missing ')' before 'constant' 
} 

bool isTrue(bool, bool) { return true; } 

void foo(); 



void run() 
{ 
    if (isTrue(true true)) foo();; 
} 

は最後から二番目の行に不足しているカンマを注意してください。

最終編集:

LOL!

bool isTrue(bool, bool) { return true; } 

void foo(); 

#define DO_IF(condition, ...) if (condition) { foo(__VA_ARGS__); } 

void run() 
{ 
    DO_IF(isTrue(true ,, true)); // ROTFL - This Compiles :) 
} 
+0

はプリプロセッサのバグである必要があります。 CPPはマクロパラメータを混乱させてはいけません。 – qrdl

+1

プリプロセッサのバグのようです。ここから ます:http://msdn.microsoft.com/en-us/library/ms177415(VS.80)がC標準には少なくとも一つの引数がに、省略記号に渡さなければならないことを指定し を」.aspxのマクロが末尾のカンマを含む式に解決されないようにしてください。 代わりに、エラーの代わりに、入力をマングルしてtrueにします。 –

+1

Microsoftが正しくありません。末尾のカンマを食べるには、## __ VAR_ARGS__を使うだけでよいので、少なくともGCCのドキュメントhttp://gcc.gnu.org/onlinedocs/cpp/Variadic-Macrosによれば、全くパラメータを指定することはできません。html – qrdl

答えて

3

引数が不定数のマクロは、1990 C標準または現在のC++標準には存在しません。私はそれらが1999年のC標準に導入されたと思うし、実装はその標準からの変更を採用するのがむしろ遅かった。彼らは来るべきC++標準になるだろう(これは来年に出るだろうと思う)。

私はVisual StudioでC99準拠を追跡するのに気を配りませんでした。主に私がC言語を使用する唯一のものは、極端な移植性が必要なためです。しかし、VS2008にはC99の部分が欠けていた可能性が高いです。

また、プログラムをC++としてコンパイルしている可能性があります。コンパイラのプロパティを確認してください。

+0

VariadicマクロはVC2005でサポートされています。 いくつかの実装上のバグはあるようですが、 –

0

DO_IFをRETURN_IFに変更すると、コードがVS2008で正常にコンパイルされます。ただし、これはあなたのエラーに関係するものを変更すべきではありません。

編集:変更しても、エラーなしでコンパイルされます。

0

私は、CPPが何をするかの置換を参照してCPP(Cプリプロセッサ)を通して、あなたのコードを実行し、それは...

RETURN_IF(isTrue(b, !b)); 

RETURN_IF(isTrue(b, b)); 
+0

これはおもちゃの例ですが、何がbであるかは関係ありません(関数を見てください) – Dolphin

+0

Er ... OK?彼はDO_IFを持っていました。返信でRETURN_IFに置き換えました。 もちろん、bは関係ありません! :) –

1

すべきではない、を除いて、それが動作するはずだと思いますあなたのマクロのために。

cppを呼び出すか、-Eパラメータをコンパイラに提供するか(もちろんgccを使用している場合)。

+0

+1おそらく、このマクロを台無しにしている別のマクロがあります。 – Dolphin

1

さまざまなプリプロセッサの実装では、カンマを貪欲に解析し、マクロ引数の区切り文字として扱います。したがって、CPPは、あなたが "DO_IF"に "isTrue(trueと" true) "の2つのパラメータで置換を実行するよう求めていると考えています。

関連する問題