ホームページ >バックエンド開発 >C++ >Windows 上の C での __try の目的と実装は何ですか?

Windows 上の C での __try の目的と実装は何ですか?

DDD
DDDオリジナル
2024-11-07 15:04:02141ブラウズ

What is the Purpose and Implementation of __try in C   on Windows?

C の __try、try/catch/finally を理解する

C では、通常、try/catch/finally ブロックが例外処理に使用されます。 。ただし、二重アンダースコアを使用した代替構文 __try があり、これは Windows に固有です。

__try を使用する場合

Windows では、例外処理は構造化メソッドによって実装されます。例外処理 (SEH)。 MSVC コンパイラで Windows をターゲットにする場合、__try 構文を使用して SEH 例外をキャッチできます。

SEH および C 例外

MSVC コンパイラは、C 例外をマップするコードを生成します。 SEH インフラストラクチャ、例外コード 0xe06d7363 (「msc」) を使用します。これにより、SEH 例外が発生したときに C デストラクターを呼び出すことができます。

デストラクターのコンパイラーの最適化

MSVC コンパイラーは、デストラクター コードが存在する場合にデストラクター コードの生成を回避するようにコードを最適化します。オブジェクトの有効期間内に throw ステートメントを使用しないでください。この最適化は、/EHa コンパイル オプションを使用することで抑制できます。これは、すべての SEH 例外を一貫してキャッチするために必要です。

SEH 例外の種類

SEH には多くの例外の種類があります。これには、オペレーティング システムによって定義されたものや、特定のアプリケーションによって使用されるものが含まれます。 .NET 例外などのマネージ例外では、例外コード 0xe0434f4d ("com") を使用します。

__try、__Except、および __finally

SEH 例外をキャッチするには、__try __excel と組み合わせて使用​​されます。これは C catch ブロックのように機能しますが、より多くの機能を備えています。 __finally を使用すると、例外処理後にコードを実行できます。

サンプル コード

提供されたコードは、両方の SEH 例外をキャッチするための __try、__excel、__finally の使用法を示しています。 (null ポインターへのアクセスによって引き起こされる) および C 例外 ( integer).

出力は、両方の例外に対してデストラクターが呼び出され、__Except が例外を正常にキャッチしたことを示しています。

以上がWindows 上の C での __try の目的と実装は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。