Several preprocessor directives are available that modify how
the <command>ecpg</command> preprocessor parses and processes a
file.
ecpg
プリプロセッサがファイルを解析および処理する方法を変更することができる、プリプロセッサ指示子が複数あります。
To include an external file into your embedded SQL program, use: 埋め込みSQLプログラムに外部ファイルをインクルードするには、以下を使用します。
EXEC SQL INCLUDEfilename
; EXEC SQL INCLUDE <filename
>; EXEC SQL INCLUDE "filename
";
The embedded SQL preprocessor will look for a file named
<literal><replaceable>filename</replaceable>.h</literal>,
preprocess it, and include it in the resulting C output. Thus,
embedded SQL statements in the included file are handled correctly.
埋め込みSQLプリプロセッサは、
という名前のファイルを探し、その前処理を行い、最終的にC出力の中に含めます。
このようにして、ヘッダファイル内の埋め込みSQL文が正しく扱われます。
filename
.h
The <command>ecpg</command> preprocessor will search a file at
several directories in following order:
ecpg
プリプロセッサは以下の順番で複数のディレクトリからファイルを検索します。
/usr/local/include
/usr/local/pgsql/include
)/usr/include
But when <literal>EXEC SQL INCLUDE
"<replaceable>filename</replaceable>"</literal> is used, only the
current directory is searched.
しかしEXEC SQL INCLUDE "
が使われる場合、現在のディレクトリのみが検索されます。
filename
"
In each directory, the preprocessor will first look for the file
name as given, and if not found will append <literal>.h</literal>
to the file name and try again (unless the specified file name
already has that suffix).
各ディレクトリの中で、プリプロセッサはまず指定されたファイル名を探します。
見つからなければ(指定されたファイル名がこの接尾辞を持っていない限り)ファイル名に.h
を付けて再検索します。
Note that <command>EXEC SQL INCLUDE</command> is <emphasis>not</emphasis> the same as:
EXEC SQL INCLUDE
は以下とは異なることに注意してください。
#include <filename
.h>
because this file would not be subject to SQL command preprocessing.
Naturally, you can continue to use the C
<literal>#include</literal> directive to include other header
files.
このファイルにはSQLコマンド用前処理が行われないためです。
当然ながら、他のヘッダファイルをインクルードするCの#include
ディレクティブを使用することができます。
The include file name is case-sensitive, even though the rest of
the <literal>EXEC SQL INCLUDE</literal> command follows the normal
SQL case-sensitivity rules.
通常のSQLの大文字小文字の区別規則に従うEXEC SQL INCLUDE
コマンドの一部であったとしても、インクルードファイルの名前は大文字小文字が区別されます。
Similar to the directive <literal>#define</literal> that is known from C,
embedded SQL has a similar concept:
Cで既知の#define
指示子と同様、埋め込みSQLでも似たような概念を持ちます。
EXEC SQL DEFINEname
; EXEC SQL DEFINEname
value
;
So you can define a name: このため、以下のように名前を定義することができます。
EXEC SQL DEFINE HAVE_FEATURE;
And you can also define constants: また、定数を定義することもできます。
EXEC SQL DEFINE MYNUMBER 12; EXEC SQL DEFINE MYSTRING 'abc';
Use <literal>undef</literal> to remove a previous definition:
事前の定義を削除するにはundef
を使用します。
EXEC SQL UNDEF MYNUMBER;
Of course you can continue to use the C versions <literal>#define</literal>
and <literal>#undef</literal> in your embedded SQL program. The difference
is where your defined values get evaluated. If you use <literal>EXEC SQL
DEFINE</literal> then the <command>ecpg</command> preprocessor evaluates the defines and substitutes
the values. For example if you write:
当然、Cの#define
や#undef
を埋め込みSQLプログラムで使用することは可能です。
違いは宣言した値がどこで評価されるかです。
EXEC SQL DEFINE
を使用する場合、ecpg
プリプロセッサがその定義を評価し、その値を置換します。
例えば、
EXEC SQL DEFINE MYNUMBER 12; ... EXEC SQL UPDATE Tbl SET col = MYNUMBER;
then <command>ecpg</command> will already do the substitution and your C compiler will never
see any name or identifier <literal>MYNUMBER</literal>. Note that you cannot use
<literal>#define</literal> for a constant that you are going to use in an
embedded SQL query because in this case the embedded SQL precompiler is not
able to see this declaration.
と記載した場合、ecpg
による置換がすでに行われていますので、CコンパイラではMYNUMBER
という名前や識別子を参照することはありません。
埋め込みSQL問い合わせで使用する予定の定数に#define
を使用することはできませんので注意してください。
この場合、埋め込みSQLプリプロセッサがこの宣言を参照することができないためです。
If multiple input files are named on the <command>ecpg</command>
preprocessor's command line, the effects of <literal>EXEC SQL
DEFINE</literal> and <literal>EXEC SQL UNDEF</literal> do not carry
across files: each file starts with only the symbols defined
by <option>-D</option> switches on the command line.
ecpg
プリプロセッサのコマンドラインに複数の入力ファイルが指定されている場合、EXEC SQL DEFINE
およびEXEC SQL UNDEF
の効果はファイル間で引き継がれません。
各ファイルはコマンドラインの-D
スイッチで定義されたシンボルのみで始まります。
You can use the following directives to compile code sections conditionally: 以下の指示子を使用して、コンパイルするコード部分を選択することができます。
EXEC SQL ifdef name
;
#
Checks a <replaceable>name</replaceable> and processes subsequent lines if
<replaceable>name</replaceable> has been defined via <literal>EXEC SQL define
<replaceable>name</replaceable></literal>.
name
を検査し、そのname
がEXEC SQL define
で定義されていた場合に後続の行を処理します。
name
EXEC SQL ifndef name
;
#
Checks a <replaceable>name</replaceable> and processes subsequent lines if
<replaceable>name</replaceable> has <emphasis>not</emphasis> been defined via
<literal>EXEC SQL define <replaceable>name</replaceable></literal>.
name
を検査し、そのname
がEXEC SQL define
で定義されていない場合に後続の行を処理します。
name
EXEC SQL elif name
;
#
Begins an optional alternative section after an
<literal>EXEC SQL ifdef <replaceable>name</replaceable></literal> or
<literal>EXEC SQL ifndef <replaceable>name</replaceable></literal>
directive. Any number of <literal>elif</literal> sections can appear.
Lines following an <literal>elif</literal> will be processed
if <replaceable>name</replaceable> has been
defined <emphasis>and</emphasis> no previous section of the same
<literal>ifdef</literal>/<literal>ifndef</literal>...<literal>endif</literal>
construct has been processed.
EXEC SQL ifdef
またはname
EXEC SQL ifndef
指示子の後で省略可能な代替セクションを開始します。
name
elif
セクションはいくつでも現れることがあり得ます。
elif
に続く行は、name
が定義されていて、かつ、同じifdef
/ifndef
...endif
構文の前のセクションが処理されていない場合に、処理されます。
EXEC SQL else;
#
Begins an optional, final alternative section after an
<literal>EXEC SQL ifdef <replaceable>name</replaceable></literal> or
<literal>EXEC SQL ifndef <replaceable>name</replaceable></literal>
directive. Subsequent lines will be processed if no previous section
of the same
<literal>ifdef</literal>/<literal>ifndef</literal>...<literal>endif</literal>
construct has been processed.
EXEC SQL ifdef
またはname
EXEC SQL ifndef
指示子の後で最後の代替セクションを開始します。
同じname
ifdef
/ifndef
...endif
構文の前のセクションが処理されていない場合に、後続の行が処理されます。
EXEC SQL endif;
#
Ends an
<literal>ifdef</literal>/<literal>ifndef</literal>...<literal>endif</literal>
construct. Subsequent lines are processed normally.
ifdef
/ifndef
...endif
構文を終了します。
後続の行は普通に処理されます。
<literal>ifdef</literal>/<literal>ifndef</literal>...<literal>endif</literal>
constructs can be nested, up to 127 levels deep.
ifdef
/ifndef
...endif
構文は127段階まで入れ子にできます。
This example will compile exactly one of the three <literal>SET
TIMEZONE</literal> commands:
この例は3つのSET TIMEZONE
コマンドのうちちょうど1つをコンパイルします。
EXEC SQL ifdef TZVAR; EXEC SQL SET TIMEZONE TO TZVAR; EXEC SQL elif TZNAME; EXEC SQL SET TIMEZONE TO TZNAME; EXEC SQL else; EXEC SQL SET TIMEZONE TO 'GMT'; EXEC SQL endif;