Goto はデストラクターを呼び出さずに関数をトラバースできますか?
Goto はコードのセクションをスキップし、デストラクターなどの実行を回避するというよくある誤解が根強く残っています。操作。この誤解は、 C をめぐる議論で特に顕著です。
スコープの制限
一般に信じられていることに反して、goto は関数の境界を越えることができません。別の関数で定義されたラベルにジャンプしようとすると、以下に示すようにコンパイラ エラーが発生します。
void f() { int x = 0; goto lol; } int main() { f(); lol: return 0; }
エラー: ラベル 'lol' は使用されていますが定義されていません
オブジェクト初期化に関する考慮事項
オブジェクトの初期化を飛び越えることも同様に許可されません。オブジェクトの初期化をスキップしようとすると、コンパイラはエラーを報告します:
int main() { goto lol; int x = 0; lol: return 0; }
エラー: ラベル 'lol' にジャンプ
エラー: ここから
エラー: の初期化と交差します。 'int x'
スコープ固有破棄
自動ストレージ期間を持つオブジェクトは、終了方法に関係なく、スコープを終了するときに破棄されます。したがって、Goto はオブジェクトの破棄をバイパスできません:
struct T { T() { cout << "*T"; } ~T() { cout << "~T"; } }; int main() { { T t; goto lol; } lol: return 0; }
出力: *T~T
オブジェクト タイプの制限
スコープにジャンプしている間非スカラー オブジェクトの使用は一般に禁止されていますが、簡単なデフォルトのコンストラクターとデストラクターを持つオブジェクトには例外があります。初期化子のない配列宣言も除外されます。
結論
Goto は、 C のスコープ機構を回避する抜け穴ではありませんが、不用意に使用すると予期しない動作を引き起こす可能性があります。それにもかかわらず、上記の制限により、意図的でない、または有害な goto の使用に対する保護が提供されます。したがって、一般に認識されているような本質的に悪ではありませんが、慎重に適用する必要があります。
以上がC では `goto` はデストラクターの実行をバイパスしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。