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