問題:
開発者が Windows 版の g を使用しているときに予期しない動作が発生しましたStrawberry Perl を通じて取得されます。 g コンパイラでは、関数が構造体を返しているにもかかわらず、void 以外の関数で return ステートメントを省略できます。
詳細な分析:
コード スニペット提供:
struct boundTag Box::getBound(int side) { struct boundTag retBoundTag; retBoundTag.box = this; switch (side) { // set retBoundTag.bound based on value of "side" } }
このような非 void 関数では、return ステートメントを省略すると未定義の動作が発生します。 ISO C -98 標準では、次のように指定されています。
関数の終わりから流れることは、値のない戻りと同等です。この結果、値を返す関数で 未定義の動作 が発生します。
警告なしでコンパイルされたのはなぜですか?
return ステートメントを省略すると、未定義になります。の動作のため、一部のコンパイラはデフォルトで警告を発行しない場合があります。より徹底した警告を有効にするには、コンパイル時に -Wall オプションを使用することをお勧めします。
Return ステートメントを省略した結果
非コードで return ステートメントを省略すると、 void 関数は予期しない結果をもたらす可能性があります。関数は初期化されていない値を返したり、プログラムをクラッシュさせる可能性があります。さらに、後続のコードで戻り値を使用すると、予期しない結果が生じる可能性があります。
結論
この場合、g コンパイラでは return ステートメントの省略が許可されていましたが、 ISO C 標準に準拠し、void 以外の関数に return ステートメントを常に含めることが重要です。 return ステートメントを省略すると、未定義の動作や予期しない結果が生じる可能性があります。
以上がC g コンパイラが構造体を返すにもかかわらず、Return ステートメントなしで関数をコンパイルするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。