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ブロックの中でも使用できます。
Object Type Translator(OTT)によって生成されるヘッダー・ファイルは、宣言部の中にインクルードする必要があります。
関連項目:
CODEオプションの値KR_CとANSI_Cの詳細は、CODEを参照してください。
Pro*C/C++のCパーサーによるコードへの効果を制御する必要があります。この制御はPARSEプリコンパイラ・オプションを使用することで可能になります。このオプションでは、プリコンパイラのCパーサーがコードの取扱方法を制御できます。
PARSEオプションの値と効果を次に示します。
表12-1 PARSEオプションの値と効果
値 | 効果 |
---|---|
PARSE=NONE |
値NONEの効果は次のとおりです。
|
PARSE=PARTIAL |
値PARTIALの効果は次のとおりです。
このオプション値は、CODE=CPPのときデフォルトです。 |
PARSE=FULL |
値FULLの効果は次のとおりです。
|
このオプション値は、CODEオプションの値がCPP以外のときのデフォルト値です。CODE=CPPのときにPARSE=FULLを指定すると、エラーになります。
C++互換コードを生成するには、PARSEオプションにNONEまたはPARTIALのいずれかを指定する必要があります。PARSE=FULLのときはCパーサーが動作し、コードにある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文を使用してインクルードできます。)