C で未定義の値を返す関数
ライブラリに出現したコード スニペットでは、Min という名前の関数が次のように定義されています。
static tvec4 Min(const tvec4& a, const tvec4& b, tvec4& out) { tvec3::Min(a,b,out); out.w = min(a.w,b.w); }
意外なことに、この関数は戻り値として値を返さないにもかかわらず、エラーなしでコンパイルされます。 type は明示的に void として宣言されていません。
C 11 ドラフト標準のセクション 6.6.3 によれば、この動作は未定義です。標準では、「関数の末尾からのフローは、値のない戻りと同等」であり、「値を返す関数で未定義の動作が発生する」と規定されています。
このシナリオでは、コンパイラは次のようになります。すべての場合において問題を正確に診断することは難しい可能性があるため、エラーや警告を提供する義務はありません。
ただし、-Wall フラグを使用すると、GCC と Clang の両方で生成するよう求めることができます。次のような警告:
warning: control reaches end of non-void function [-Wreturn-type]
この警告をエラーに変換して、より高いレベルのコード品質を確保するには、-Werror=return-type フラグを使用できます。さらに、包括的なエラー検出には、-Wextra -Wconversion -pedantic フラグをお勧めします。
Visual Studio では、前述のコードによりエラー C4716 がトリガーされます。
error C4716: 'Min' : must return a value
すべてのコードがそうでない場合パスは値を返しますが、代わりに警告 C4715 が発行されます。
以上が明示的な `return` ステートメントのない C 関数がエラーなしでコンパイルされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。