ブックタイトルTET5
- ページ
- 27/228
このページは TET5 の電子ブックに掲載されている27ページの概要です。
秒後に電子ブックの対象ページへ移動します。
「ブックを開く」ボタンをクリックすると今すぐブックを開きます。
このページは TET5 の電子ブックに掲載されている27ページの概要です。
秒後に電子ブックの対象ページへ移動します。
「ブックを開く」ボタンをクリックすると今すぐブックを開きます。
TET5
3.2 CバインディングTETはC言語で、いくつかのC++モジュールを用いて書かれています。Cバインディングを利用するには、静的または共有ライブラリのいずれかを使用することができ(Windows・MVSの場合はDLL)、自分のソースモジュールにインクルードするためのセントラルTETインクルードファイルtetlib.hが必要です。注記C用のTETバインディングを用いるアプリケーションは、C++コンパイラでリンクする必要があります。なぜならこのライブラリにはC++で実装されている部分があるからです。Cリンカを使用すると、アプリケーションを必要なC++サポートライブラリ群にリンクしないかぎり、非決定の外部参照を引き起こす可能性があります。例外処理TETのAPIは、C言語にはネイティブな例外処理がないのを補うために、このライブラリが発生させた例外に対処するためのしくみを提供しています。TET_TRY( )マクロとTET_CATCH( )マクロを用いることにより、例外発生時にエラー処理やクリーンアップを実行させるためのコードを入れ込んだクライアントコードを組み立てることができるのです。これらのマクロはコード内に2つの部分を切り分けます。1つはtry節で、例外を発生させる可能性のあるコードを持ち、もう1つはcatch節で、例外に対処するコードを持ちます。tryブロックの中から呼び出されたAPI関数のいずれかが例外を発生させたとき、プログラムの実行はただちにcatchブロックの先頭ステートメントに移ります。TETのクライアントのコードは以下の規則に従う必要があります:> TET_TRY( )とTET_CATCH( )は必ず対にしなければなりません。> TET_new( )は決して例外を発生させません。tryブロックは、有効なTETオブジェクトハンドルを用いなければ開始させることができないので、TET_new( )はすべてのtryブロックの外で呼び出さなければなりません。> TET_delete( )は決して例外を発生させません。よって、すべてのtryブロックの外で安全に呼び出すことができます。catch節の中で呼び出すこともできます。> tryブロックとcatchブロックの両方の中で用いられている変数については特別な注意を払う必要があります。コンパイラは、制御がブロックからブロックへ移ることは知らないので、そのような場合、不適切なコードを生成する可能性があります(レジスタ変数最適化等)。幸い、この種の問題を避ける簡単な規則があります。tryブロックとcatchブロックの両方で用いられる変数はvolatileと宣言する必要があるのです。volatileキーワードの使用はコンパイラに、危険な最適化を変数に行ってはならないということを知らせます。> tryブロックを抜ける場合には(たとえばreturnステートメントによって、ひいては対応するTET_CATCH( )の実行をバイパスして)、returnステートメントの前にTET_EXIT_TRY( )マクロを呼び出して、例外のしくみにそのことを通知する必要があります。>例外が発生したら文書処理は止めなければなりません。以下のコードに、これらの規則の遵守例を示します。クライアントのコード内でTETの例外を扱う際の典型的な書き方もあわせて示しています(完全なサンプルはTETパッケージ内にあります):volatile int pageno;...if ((tet = TET_new()) == (TET *) 0){printf("メモリがいっぱいです\n");return(2);3.2 Cバインディング27