cpp コマンド
目的
C 言語ソース・ファイルについてファイルの組み込みとマクロの置換を実行します。
構文
/usr/ccs/lib/cpp [ -C ] [ -P ] [ -qDBCS ] [ -IDirectory ] [ -UName ] [ -DName [ =Defin ition ] ] [ -qlanglvl=Language ] [ InFile ] [ OutFile ]
説明
cpp コマンドは C 言語ソース・ファイル上でファイルの組み込みとマクロの置換を実行します。 InFile を読み込んで、OutFile に書き込みます (デフォルトでは、標準入力と標準出力です)。
cpp コマンドは、Draft American National Standard for Information Systems - Programming Language C (X3J11/88-159) で定義されているように、C 言語用のプリプロセッサー指示および命令に準拠するように設計されています。
cpp プログラムは、以下の特殊名を識別します。
項目 | 説明 |
---|---|
__LINE__ | 現在行番号。 |
__DATE__ | ソース・ファイルの変換日。 |
__TIME__ | ソース・ファイルの変換時刻。 |
__STDC__ | 規格に合った処理系を示します。 |
__FILE__ | 現行ファイル名。 |
__STR__ | コンパイラーが一定の文字列関数 (/usr/include/string.h 内で定義) についてインライン・コードを生成することを示します。 |
__MATH__ | コンパイラーが一定の数理関数 (/usr/include/math.h 内で定義) についてインライン・コードを生成することを示します。 |
__ANSI__ | langlvl が ANSI と同じ値に設定されていることを示します。 |
__SAA__ | langlvl が SAA と同じ値に設定されていることを示します。 |
__SAA_L2__ | langlvl が SAAL2 と同じ値に設定されていることを示します。 |
__EXTENDED__ | langlvl が extended と同じ値に設定されていることを示します。 |
__TIMESTAMP__ | ソース・ファイルが最終変更日時を示します。 |
cpp 指示行はすべて # (ポンド記号) で始めなければなりません。 指示行には以下のものがあります。
項目 | 説明 |
---|---|
#define Name TokenString | 後続の Name のインスタンスを TokenString に置換します。 |
#define Name(Argument,...,Argument) TokenString | 後続の Name (Argument, . . . ,Argument) シーケンスのインスタンスを TokenString に置換します。 この場合、TokenString 内の Argument の各オカレンスは、コンマ区切りリスト内の対応するトークンに置き換えられます。 Name と左括弧との間にスペースが一切あってはならないことに注意してください。 |
#undef Name | このポイントから後の Name の定義を無視します。 |
#include "File" または #include <File> | このポイントに cpp がそのとき処理している File の内容を組み込みます。
File を " " (二重引用符) で囲むと、cpp コマンドは最初にディレクトリー InFile 内を検索し、次に -I フラグで名前が指定されたディレクトリー内を検索し、最後に標準リスト上のディレクトリー内を検索します。 <File> 表記法を使うと、cpp コマンドは標準ディレクトリー内でのみ File を検索します。 InFile が常駐するディレクトリーは検索しません。 |
#line Number ["File"] | 次のソース行シーケンスが Number で指定された行番号を持つソース行で始まるかのように、処理系を動作させます。 File を指定すると、想定されるファイル名を File に変更します。 |
#error TokenString | TokenString を含む診断メッセージを生成します。 |
#pragma TokenString | コンパイラーに対する処理系定義の指示。 |
#endif | 検査指示 (#if、 #ifdef、または #ifndef) で始まる行のセクションを終了します。 各検査指示には、一致する #endif がなければなりません。 |
#ifdef Name | 以下の場合にだけ、後続の行を出力に入れます。
Name が以前の #define によって定義されている場合。または Name が -D フラグによって定義されている場合。 または Name が cpp コマンドによって認識される特殊名であり、 かつ 介入する #undef で Name を未定義でなかった場合。 または -U フラグで Name を未定義でなかった場合。 |
#ifndef Name | 以下の場合にだけ、後続の行を出力に入れます。
Name が以前の #define で定義されておらず かつ Name が cpp コマンドによって認識される特殊名でない場合。 または Name が以前の #define によって定義されていて、介入する #undef には定義されていない場合。 または Name が cpp コマンドによって認識された特殊名であって、 -U フラグには定義されていない場合。 |
#if Expression | Expression がゼロ以外の値であると評価される場合にのみ、後続の行を出力に入れます。
すべての 2 項非代入 C 演算子、?: 演算子、単項 -、!、- 演算子が Expression 内で使用できます。
演算子の優先順位は、C 言語で定義されている優先順位と同じです。
また、Expression 内では、以下の 2 つのフォーマットで単項演算子 defined が使えます。
|
#elif Expression | 前の #if または #elif 指示内の式が偽と評価されるか、未定義の場合にのみ、後続の行を出力に入れ、この Expression を真と評価します。 |
#else | 前の #if または #elif 指示内の式が偽と評価されるか、未定義の (したがって、#if の後の行と、#else の前の行は無視されている) 場合にのみ、後続の行を出力に入れます。
各検査指示の条件は、順に検査されます。 偽 (0) と評価されると、それを制御するグループがスキップされます。 各指示は、ネスト化条件のレベルを追跡するために、その指示を決定する名前を通じてのみ処理されます。指示のプリプロセス・トークンの残りの部分は、グループ内の他のプリプロセス・トークンと同様、無視されます。 制御条件が真 (ゼロ以外の値) と評価される最初のグループのみが処理されます。 条件がいずれも真と評価されず、#else 指示があれば #else が制御するグループが処理されます。 #else 指示がなければ、#endif までの、すべてのグループがスキップされます。 |
フラグ
項目 | 説明 |
---|---|
-C | C 言語コメントをソース・ファイルから出力ファイルにコピーします。 このフラグを省略すると、cpp コマンドは cpp 指示行にあったものを除いたすべての C 言語コメントを除去します。 |
-DName[=Definition] | Name を #define ディレクティブとして定義します。 デフォルトの Definition は 1 です。 |
-I Directory | 最初に Directory 内で、次に標準リストのディレクトリー内で、/ (スラッシュ) で始まらない名前を持つ #include ファイルを探します。 #include の説明を参照してください。 |
-P | 次の C コンパイラーの実行に渡す行制御情報を生成せずに、入力をプリプロセスします。 |
-qDBCS | 2 バイト文字セット・モードを指定します。 |
-U Name | Name の最初の定義を除去します。この場合、Name はプリプロセッサーによって事前定義された記号です (ただし、4 つのプリプロセッサー・モード・インジケーター __ANSI__、__EXTENDED__、 __SAA__、および __SAA_L2__ を除きます)。 このフラグは ANSI モードでは認識されません。 |
-qlanglvl=Language | 処理用の言語レベルを選択します。Language には、ANSI、SAA、SAAL2、
または extended を指定できます。
デフォルトは extended です。
注: Language が extended であれば、_NO_PROTO は自動的に定義されるわけではありません。このように定義するには、/etc/xlc.cfg ファイル内で -D オプションを使います。 |
例
- プリプロセッサーが C コンパイラーに送るテキストを表示するには、
以下のように入力します。
ここでは、pgm.c をプリプロセスして、結果として生成されるテキストをワークステーションで表示します。マクロ定義内のエラーを探す場合に、プリプロセッサーの出力を見ることができます。/usr/ccs/lib/cpp pgm.c
- より読みやすくプリプロセスされたテキストが入っているファイルを作成するには、
以下のように入力します。
これは、pgm.c をプリプロセスして、その結果を pgm.i に格納します。それはまた、C コンパイラー用の行番号情報を省略して (-P)、プログラム・コメント (-C) を組み込みます。/usr/ccs/lib/cpp -P -C pgm.c pgm.i
- マクロ ID を事前定義するには、以下のように入力します。
ここでは、プリプロセスを実行する前に、 値 512 で BUFFERSIZE を定義し、 値 1 で DEBUG を定義します。/usr/ccs/lib/cpp -DBUFFERSIZE=512 -DDEBUG pgm.c pgm.i
- 非標準ディレクトリー内にある #include ファイルを使うには、
以下のように入力します。
ここでは、最初に現行ディレクトリー内で、 次に /home/jim/include 内で、 最後に標準ディレクトリー内で、 引用符付きの #include ファイルを探します。 また、最初に /home/jim/include 内で、次に標準ディレクトリー内で、不等号括弧付き (< >) の #include ファイルを探します。/usr/ccs/lib/cpp -I/home/jim/include pgm.c
- ANSI 定義を使ってプリプロセスを実行するには、以下のように入力します。
/usr/ccs/lib/cpp -qlanglvl=ansi pgm.c
ファイル
項目 | 説明 |
---|---|
/usr/include | #include ファイルの標準ディレクトリー。 |