戻り値がないにもかかわらず、この C スニペットはコンパイルされるのはなぜですか?
提供されたコード スニペット内:
static tvec4 Min(const tvec4& a, const tvec4& b, tvec4& out) { tvec3::Min(a, b, out); out.w = min(a.w, b.w); }
関数 Min は tvec4 を返すように宣言されていますが、コードでは明示的な return ステートメントが提供されていません。これにより、コンパイラがなぜエラーなしでコードをコンパイルするのかという疑問が生じます。
未定義の動作
C 11 ドラフト標準によると、値の末尾から流れ出す-戻り値を提供せずに関数を返すと、未定義の動作が発生します。これは、そのような場合にコンパイラがエラーや警告を発行する義務がないことを意味します。
コンパイラ オプション
ただし、警告を発したり、エラーを生成したりするようにコンパイラを設定することもできます。未定義の動作の場合。たとえば、-Wall フラグを使用すると、次のような警告がトリガーされることがあります。
warning: control reaches end of non-void function [-Wreturn-type]
-Werror=return-type フラグを追加すると、コンパイラはこの警告をエラーとして扱い、コードを強制的に次のように処理します。
Visual Studio
Visual Studio では、コードでエラーが生成されます。デフォルトでは C4716:
error C4716: 'Min' : must return a value
すべてのコード パスが値を返さない場合、Visual Studio は警告 (C4715) を発行します。
以上が戻り値の型を宣言しているにもかかわらず、C 関数が明示的な return ステートメントなしでコンパイルされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。