私はこれを調べた結果、これらすべてがC4353を生成するすべての有効なステートメントであることがわかりました。私の唯一の推測は、これがCで何もしない古い方法だということです。なぜこれはエラーではありません。あなたはこれを使って何か有用なことをしますか?vs2010 C4353なぜこれはエラーではありません
int main()
{
nullptr();
0();
(1 == 2)();
return 0;
}
私はこれを調べた結果、これらすべてがC4353を生成するすべての有効なステートメントであることがわかりました。私の唯一の推測は、これがCで何もしない古い方法だということです。なぜこれはエラーではありません。あなたはこれを使って何か有用なことをしますか?vs2010 C4353なぜこれはエラーではありません
int main()
{
nullptr();
0();
(1 == 2)();
return 0;
}
関数式として定数0を使用するのは、Microsoft固有の拡張です。彼らはこれを具体的に実装しました。なぜなら、その理由を見て、それをエラーとして扱うのが理にかなっていない理由を説明するからです。しかし、それは非標準的なので、コンパイラは警告を発します。
__noop()を使用する代わりに正しいことは間違いありません。
これらのすべて:
nullptr();
0();
(1 == 2)();
は(彼らは何もしないという意味)ノーオペレーション文です。
btw警告を無視しないことを願っています。ほとんどの場合、すべての警告を修正することをお勧めします。
私は私が行っているプロジェクトはしません – rerun
としては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");
}
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();
}
ご覧のとおり、古典的なマクロの使用方法をサポートすることです。
C4353とは何ですか? –
GCC-4.3.4は[3つ全てのエラー](http://www.ideone.com/sy9cd)を発行しています。これは、VC2010がコンパイラ拡張としてサポートしていることを示しています。 –
「これらはすべてすべて有効な記述です」とはどういう意味ですか?このコードをコンパイルできないVisual C++ 10.0以外のコンパイラが少なくとも1つは知っています。 p.s. vs2010はコンパイラの名前ではありません。「私はVimからこのコードをコンパイルします」と言っています... :-) – mloskot