C++アプリケーションECPGはC++アプリケーションを多少の制限がありますがサポートします。本節ではいくつかの注意を説明します。ecpgプリプロセッサはC(またはCのようなもの)と埋め込みSQLコマンドで記述された入力ファイルを取り、埋め込みSQLコマンドをC言語の小塊に変換し、最終的に.cファイルを作成します。このためC++でも継ぎ目なく動作するはずです。一般的には、ecpgプリプロセッサはCのみを理解しています。C++言語の特殊な構文や予約語を取り扱いません。このため、C++に特化した複雑な機能を使用するC++アプリケーションコードの中に記述された埋め込みSQLコードの一部は、正しく前処理することに失敗する、または想定通りに動作しないかもしれません。C++アプリケーションで埋め込みSQLコードを使用する安全な方法は、ECPGの呼び出しをCモジュール内に隠蔽し、残りのC++コードとまとめてリンクすることです。C++アプリケーションコードがデータベースにアクセスするためにはそのCモジュールを呼び出します。外部のCモジュールを用いたC++アプリケーションの開発を参照してください。ホスト変数のスコープecpgプリプロセッサはCにおける変数のスコープを理解しています。C言語では、変数のスコープはコードブロックに基づきますので、どちらかといえば単純です。クラスメンバ変数は宣言場所とは異なるコードブロック内で参照されます。このためecpgプリプロセッサはクラスメンバ変数のスコープを理解していません。以下の場合、ecpgプリプロセッサはtestメソッド内のdbname変数の定義を見つけることができません。このためエラーになります。ALL;}このコードは以下のようなエラーになります。declaredこのスコープ問題を回避するためには、testメソッドを中間格納領域としてローカル変数を使用するように変更することができます。この手法は悪い回避策でしかありません。コードを醜くしますし性能も劣化させます。外部のCモジュールを用いたC++アプリケーションの開発C++におけるecpgの技術的な制限を理解しているのであれば、ECPG機能を使用するC++アプリケーションを実現するためには、リンク段階でCオブジェクトとC++オブジェクトをリンクする方が、C++コード内で埋め込みSQLコマンドを直接記述することより優れているという結論に至るでしょう。本節では、簡単な例を用いて、C++アプリケーションコードから埋め込みSQLコマンドを分離する方法について説明します。この例では、アプリケーションはC++で実装し、PostgreSQLサーバに接続するためにCおよびECPGを使用します。Cファイル(*.pgc)、ヘッダファイル、C++ファイルという3種類のファイルを作成しなければなりません。test_mod.pgcC内に埋め込まれたサブルーチンモジュールです。プリプロセッサによりtest_mod.cに変換されます。ALL;}test_mod.hCモジュール(test_mod.pgc)内の関数宣言を持つヘッダファイルです。test_cpp.cppでインクルードされます。"C"ブロックを持たなければなりません。__cplusplus}#endiftest_cpp.cppmainルーチンとこの例でのC++クラスを含む、アプリケーションの主要コードです。0;}アプリケーションを構築するためには、以下の処理を行います。ecpgを実行してtest_mod.pgcをtest_mod.cに変換します。Cコンパイラを用いてtest_mod.cをコンパイルしtest_mod.oを生成します。test_mod.o次にC++コンパイラを用いてtest_cpp.cppをコンパイルしtest_cpp.oを生成します。test_cpp.o最後に、C++コンパイラドライバを用いてtest_cpp.oおよびtest_mod.oというオブジェクトファイルを実行形式ファイルにリンクします。埋め込みSQLコマンド。