ホームページ > バックエンド開発 > C++ > C では `goto` はデストラクターの実行をバイパスしますか?

C では `goto` はデストラクターの実行をバイパスしますか?

Linda Hamilton
リリース: 2024-12-01 04:52:14
オリジナル
887 人が閲覧しました

Does `goto` Bypass Destructor Execution in C  ?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート