Symbianは、そのLeaveメカニズムを次の点で実装しlongjmp()ました。これは、実行する必要のあるすべてのことを順を追って説明するのに役立ちます。
Symbianにはグローバルな「クリーンアップスタック」があり、ジャンプが発生した場合にクリーンアップしたいものをプッシュしてポップします。これは、C++例外がスローされたときにC++コンパイラが実行する自動スタックアンワインドの手動による代替手段です。
Symbianには、ジャンプする「トラップハーネス」がありました。これらはネストできます。
(Symbianは最近、C ++例外に関して再実装しましたが、インターフェイスは変更されていません)。
全体として、適切なC ++例外は、コーディングエラーが発生しにくく、独自のC同等の例外をロールするよりもはるかに高速であると思います。
(最新のC ++コンパイラは、たとえば、スローされない場合の「オーバーヘッドゼロ」例外に非常に優れています。longjmp()ジャンプが後で行われない場合でも、すべてのレジスタの状態などを格納する必要があるため、基本的に、これほど高速になることはありません。例外。)
例外とRAIIのみを採用するより良いCとしてC++を使用することはlongjmp()、例外エミュレーションに使用するのに適したルートです。