プライマリ・コンテンツに移動
Pro*C/C++プログラマーズ・ガイド
12c リリース1(12.1)
B71397-03
目次へ移動
目次
索引へ移動
索引

前
次

C++のプリコンパイル

C++に対応できるようにプリコンパイルを制御するには、次の4点を考慮する必要があります。

コードの生成

プリコンパイラで生成されるコードの種類(C互換コードまたはC++互換コード)を指定する必要があります。デフォルトでは、Pro*C/C++によってC言語のコードが生成されます。C++は、C言語の完全なスーパーセットではありません。生成されるコードをC++のコンパイラでコンパイルするには、コードを多少変更する必要があります。

たとえば、プリコンパイラでは、アプリケーション・コードが出力されるのみでなく、ランタイム・ライブラリSQLLIBに対するコールが挿入されます。SQLLIB内の関数は、C関数です。特殊なC++版のSQLLIBはありません。このため、C++コンパイラを使用して生成したコードをコンパイルするには、SQLLIB内でコールした関数をPro*C/C++によりC関数として宣言する必要があります。

C言語の出力では、プリコンパイラにより次のようなプロトタイプが生成されます。

void sqlora(unsigned long *, void *);

ただし、C++互換コードの場合には、プリコンパイラで次のようなコードを生成する必要があります。

extern "C" {
void sqlora(unsigned long *, void *);
};

Pro*C/C++によって生成されるコードの種類は、CODEというプリコンパイラ・オプションを使用して制御します。このオプションの値は、CPP、KR_CおよびANSI_Cの3つです。これらのオプションの違いは、SQLLIB関数sqloraの宣言方法がCODEオプションの3つの値で異なることを考えると説明できます。

void sqlora( /*_ unsigned long *, void * _*/);  /* K&R C */

void sqlora(unsigned long *, void *);           /* ANSI C */

extern "C" {                                    /* CPP */
void sqlora(unsigned long *, void *);
};

CODE=CPPを指定すると、プリコンパイラは次を行います。

  • C++互換コードを生成します。

  • 出力ファイルに、標準の「.c」拡張子ではなく、「.C」や「.cc」など、プラットフォーム固有のファイル拡張子(接尾辞)を付けます。(この設定は、CPP_SUFFIXオプションを使用して上書きできます。)

  • PARSEオプションの値をデフォルトのPARTIALにします。また、PARSE=NONEも指定できます。PARSE=FULLを指定すると、プリコンパイル時にエラーが発生します。

  • C++形式の//コメントをコード内で使用可能にします。CODE=CPPのときは、この形式のコメントをSQL文およびPL/SQLブロックの中でも使用できます。

  • Pro*C/C++は//+で始まるSQLオプティマイザ・ヒントを認識できます。

  • Object Type Translator(OTT)によって生成されるヘッダー・ファイルは、宣言部の中にインクルードする必要があります。

    関連項目:

    CODEオプションの値KR_CとANSI_Cの詳細は、CODEを参照してください。

コードの解析について

Pro*C/C++のCパーサーによるコードへの効果を制御する必要があります。この制御はPARSEプリコンパイラ・オプションを使用することで可能になります。このオプションでは、プリコンパイラのCパーサーがコードの取扱方法を制御できます。

PARSEオプションの値と効果を次に示します。

表12-1 PARSEオプションの値と効果

効果

PARSE=NONE

値NONEの効果は次のとおりです。

  • Cプリプロセッサ・ディレクティブは、宣言部の中にある場合のみ解釈されます。

  • ホスト変数はすべて、宣言部の中に宣言する必要があります。

  • プリコンパイラ・リリース1.xの動作。

PARSE=PARTIAL

値PARTIALの効果は次のとおりです。

  • すべてのプリプロセッサ・ディレクティブが解釈されます。

  • ホスト変数はすべて、宣言部の中に宣言する必要があります。

このオプション値は、CODE=CPPのときデフォルトです。

PARSE=FULL

値FULLの効果は次のとおりです。

  • プリコンパイラのCパーサーがコード上で動作します。

  • すべてのプリプロセッサ・ディレクティブが解釈されます。

  • ホスト変数は、C言語で有効に宣言できる位置であればどこにでも宣言できます。

このオプション値は、CODEオプションの値がCPP以外のときのデフォルト値です。CODE=CPPのときにPARSE=FULLを指定すると、エラーになります。

C++互換コードを生成するには、PARSEオプションにNONEまたはPARTIALのいずれかを指定する必要があります。PARSE=FULLのときはCパーサーが動作し、コードにあるC++クラスなどの構文は認識されません。

出力ファイル名の拡張子

ほとんどのCコンパイラでは、入力ファイルのデフォルト拡張子は.cになります。しかし、C++コンパイラでは、ファイル名の拡張子がコンパイラごとに異なる場合があります。CPP_SUFFIXオプションを指定すると、プリコンパイラで生成されるファイル名拡張子を指定できます。このオプションの値は、引用符もピリオドも付けない文字列です。たとえば、CPP_SUFFIX=ccまたはCPP_SUFFIX=Cのように指定します。

システム・ヘッダー・ファイル

Pro*C/C++では、プラットフォーム固有の標準的な位置でstdio.hなどの標準のシステム・ヘッダー・ファイルが検索されます。Pro*C/C++では、hppまたはh++などの拡張子が付いたヘッダー・ファイルは検索されません。たとえば、ほとんどのUNIXシステムではstdio.hファイルのフルパス名は/usr/include/stdio.hです。

ただし、C++コンパイラは独自のバージョンのstdio.hを持っており、これはシステムの標準位置にはありません。C++でのプリコンパイル時には、Pro*C/C++でシステム・ヘッダー・ファイルを検索できるように、SYS_INCLUDEプリコンパイラ・オプションを使用してディレクトリ・パスを指定する必要があります。次に例を示します。

SYS_INCLUDE=(/usr/lang/SC2.0.1/include,/usr/lang/SC2.1.1/include)

システム・ヘッダー・ファイル以外の位置を指定するには、INCLUDEプリコンパイラ・オプションを使用します。SYS_INCLUDEオプションで指定したディレクトリは、INCLUDEオプションで指定したディレクトリよりも前に検索されます。INCLUDEも参照してください。

PARSE=NONEのときは、Pro*C/C++はシステム・ヘッダー・ファイルをインクルードする必要がないため、システム・ファイルについてSYS_INCLUDEおよびINCLUDEで指定した値は無視されます。(ただし、当然ながら、sqlca.hなどのPro*C/C++固有のヘッダーは、EXEC SQL INCLUDE文を使用してインクルードできます。)