![]() |
![]() |
|
|
C++ コンパイラ
アプリケーション・サーバの開発時に C++ コンパイラを使用する場合と、C コンパイラを使用する場合では、基本的に次の 2 点が異なります。
サービス関数の宣言
C++ コンパイラでサービス関数を宣言する場合、extern "C" を使用して、"C" リンクを持つサービス関数を宣言しなければなりません。次のように、関数のプロトタイプを指定します。
#ifdef __cplusplus
extern "C"
#endif
MYSERVICE(TPSVCINFO *tpsvcinfo)
C リンクを持つサービス名を宣言すると、C++ コンパイラによって名前が変更されなくなります。多くの C++ コンパイラでは、パラメータおよび関数の戻り値の型情報を含むように関数名が変更されます。
このように宣言すると、次の操作が可能になります。
コンストラクタとデストラクタ
C++ のコンストラクタは、クラス・オブジェクトを作成するときに呼び出されて、クラス・オブジェクトを初期化します。デストラクタは、クラス・オブジェクトを破棄するときに呼び出されます。コンストラクタとデストラクタを持つ自動 (ローカルで非静的な) 変数では、変数がスコープに入るときにコンストラクタが呼び出され、変数がスコープから出るときにデストラクタが呼び出されます。ただし、tpreturn() または tpforward() 関数 が呼び出されると、longjmp(3) を使用して、非ローカルの goto がコンパイラによって実行され、自動変数のデストラクタは呼び出されません。この問題を防ぐには、tpreturn() や tpforward() の呼び出しが、サービス・ルーチンから呼び出される関数からではなく、サービス・ルーチンから直接行われるようにアプリケーションをコーディングします。また、次のいずれかの条件を満たす必要があります。
つまり、tpreturn() または tpforward() 関数を呼び出すときに、現在の関数のスコープ内またはスタック上にデストラクタ付を持つ自動変数が存在しないように、アプリケーションを定義します。
コンストラクタとデストラクタを持つグローバル変数および静的変数を正しく処理するために、多くの C++ コンパイラでは main() のコンパイルに C++ コンパイラを使用する必要があります。
注記 main() ルーチンには、プログラム開始時にコンストラクタ、プログラム終了時にデストラクタを確実に実行するための特別な処理が定義されています。
main() は BEA Tuxedo システムで提供される関数なので、直接コンパイルされることはありません。ファイルが C++ を使用してコンパイルされるには、buildserver コマンドで C++ コンパイラを使用する必要があります。デフォルトでは、buildserver コマンドは UNIX の cc コマンドを呼び出します。buildserver コマンドから C++ コンパイラが呼び出されるようにするには、CC 環境変数に C++ コンパイラの絶対パス名を設定します。また、C++ のコマンド行で指定するオプションにフラグを設定するには、CFLAGS 環境変数を設定します。詳細については、「環境変数の設定」を参照してください。
![]() |
![]() |
![]() |
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|