2011-10-21 17 views
1

私はこれを調べた結果、これらすべてがC4353を生成するすべての有効なステートメントであることがわかりました。私の唯一の推測は、これがCで何もしない古い方法だということです。なぜこれはエラーではありません。あなたはこれを使って何か有用なことをしますか?vs2010 C4353なぜこれはエラーではありません

int main() 
{ 
    nullptr(); 
    0(); 
    (1 == 2)(); 
    return 0; 

} 
+0

C4353とは何ですか? –

+0

GCC-4.3.4は[3つ全てのエラー](http://www.ideone.com/sy9cd)を発行しています。これは、VC2010がコンパイラ拡張としてサポートしていることを示しています。 –

+1

「これらはすべてすべて有効な記述です」とはどういう意味ですか?このコードをコンパイルできないVisual C++ 10.0以外のコンパイラが少なくとも1つは知っています。 p.s. vs2010はコンパイラの名前ではありません。「私はVimからこのコードをコンパイルします」と言っています... :-) – mloskot

答えて

3

関数式として定数0を使用するのは、Microsoft固有の拡張です。彼らはこれを具体的に実装しました。なぜなら、その理由を見て、それをエラーとして扱うのが理にかなっていない理由を説明するからです。しかし、それは非標準的なので、コンパイラは警告を発します。

__noop()を使用する代わりに正しいことは間違いありません。

1

これらのすべて:

nullptr(); 
    0(); 
    (1 == 2)(); 

は(彼らは何もしないという意味)ノーオペレーション文です。

btw警告を無視しないことを願っています。ほとんどの場合、すべての警告を修正することをお勧めします。

+0

私は私が行っているプロジェクトはしません – rerun

1

としてはC4353 warning pageで説明し__noop intrinsic documentationに、関数式として0の使用は、関数の呼び出しを無視するが、それでも(副作用)引数を評価するコードを生成するには、Microsoft C++コンパイラに指示します。

#if DEBUG 
    #define PRINT printf_s 
#else 
    #define PRINT __noop 
#endif 

int main() { 
    PRINT("\nhello\n"); 
} 
0

MSDN pageその警告のための十分な説明と有する:

与えられた例

DEBUGプリプロセッサシンボルの値に応じて、 __noopまたは印刷機能に #definedのいずれかを取得し、トレースマクロです動機付けする例:

// C4353.cpp 
// compile with: /W1 
void MyPrintf(void){}; 
#define X 0 
#if X 
    #define DBPRINT MyPrint 
#else 
    #define DBPRINT 0 // C4353 expected 
#endif 
int main(){ 
    DBPRINT(); 
} 

ご覧のとおり、古典的なマクロの使用方法をサポートすることです。

関連する問題