Jens がコメントで指摘したように、投稿されたコードは未定義の動作を示しません。ここでの元の答えは正しくなく、とにかく質問に答えているようには見えません(数年後にすべてを読み直したとき)。
main()
この質問は、「MSVCは、他の機能と同じ状況で警告 C4716 を発行しないのはなぜですか」と要約できます。
診断 C4716 は警告であり、エラーではないことに注意してください。C 言語に関する限り (とにかく標準的な観点から)、エラー以外を診断する必要はありません。しかし、それはなぜ違いがあるのか を実際に説明するものではありません。それは、あまり文句を言うことができないということを意味するかもしれない技術的なことです...
MSVC が他の機能に対して警告を発行するときに警告を発行しない理由の本当の説明はmain()
、MSVC チームの誰かだけが実際に答えることができます。私が知る限り、ドキュメントは違いを説明していませんが、何かを見逃したのかもしれません。だから私にできることは推測することだけです:
C++ では、右中括弧の直前に main()
暗黙的な関数があるという点で、関数は特別に扱われます。return 0;
Microsoft の C コンパイラは、C モードでコンパイルするときに同じ処理を提供すると思われます (アセンブリ コードを見ると、 がなくても EAX レジスタがクリアされますreturn 0;
)、したがって、コンパイラに関する限り、発行する理由はありません。警告 C4716。Microsoft の C モードは C90 準拠であり、C99 準拠ではないことに注意してください。C90 では、「running off the end」のmain()
動作は未定義です。ただし、常に 0 を返すことは、未定義の動作の低い要件を満たしているため、問題はありません。
したがって、問題のプログラムが最後まで実行されたmain()
としても (未定義の動作が発生した場合)、警告は表示されません。
元の、あまり良い答えではありません:
ANSI/ISO 90 C では、これは未定義の動作であるため、MS は実際にエラーを生成する必要があります (ただし、標準では要求されていません)。C99 では、return
C++ と同様に、標準で main() の最後に暗黙の を許可しています。
したがって、これが C++ または C99 としてコンパイルされている場合、エラーはなく、 と同じreturn 0;
です。C90 では、未定義の動作が発生します (診断は必要ありません)。
興味深いことに (そうではないかもしれませんが)、いくつかのコンパイラ (VC9、VC6、GCC 3.4.5、Digital Mars、Comeau) の中で、基本的な、ほとんどがデフォルトのオプション セット (私がほとんど常に使用している環境) でこれを試してみました。コード スニペットの n-dirty テストなど)、return ステートメントの欠落について警告する唯一のコンパイラは、C++ プログラムとしてコンパイルするときに VC6 です (VC6 は、C 用にコンパイルするときに文句を言いません)。
関数に名前が付けられていない場合、ほとんどのコンパイラは文句を言います (警告またはエラー) main
。C 用にコンパイルするときの Digital Mars はそうではなく、GCC は C または C++ 用にコンパイルしません。