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__ langlvlSAA と同じ値に設定されていることを示します。
__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 フラグによって定義されている場合。

または

Namecpp コマンドによって認識される特殊名であり、

かつ

介入する #undefName を未定義でなかった場合。

または

-U フラグで Name を未定義でなかった場合。

#ifndef Name 以下の場合にだけ、後続の行を出力に入れます。

Name が以前の #define で定義されておらず

かつ

Namecpp コマンドによって認識される特殊名でない場合。

または

Name が以前の #define によって定義されていて、介入する #undef には定義されていない場合。

または

Namecpp コマンドによって認識された特殊名であって、 -U フラグには定義されていない場合。

#if Expression Expression がゼロ以外の値であると評価される場合にのみ、後続の行を出力に入れます。 すべての 2 項非代入 C 演算子、?: 演算子、単項 -、!、- 演算子が Expression 内で使用できます。 演算子の優先順位は、C 言語で定義されている優先順位と同じです。 また、Expression 内では、以下の 2 つのフォーマットで単項演算子 defined が使えます。
defined (Name) または defined Name
これにより、#if 指示の中で #ifdef および #ifndef のユーティリティーが使えます。 Expression には、cpp が理解するこれらの演算子、整数定数、および名前しか使えません。 sizeof 演算子は使えません。
#elif Expression 前の #if または #elif 指示内の式が偽と評価されるか、未定義の場合にのみ、後続の行を出力に入れ、この Expression を真と評価します。
#else 前の #if または #elif 指示内の式が偽と評価されるか、未定義の (したがって、#if の後の行と、#else の前の行は無視されている) 場合にのみ、後続の行を出力に入れます。

各検査指示の条件は、順に検査されます。 偽 (0) と評価されると、それを制御するグループがスキップされます。 各指示は、ネスト化条件のレベルを追跡するために、その指示を決定する名前を通じてのみ処理されます。指示のプリプロセス・トークンの残りの部分は、グループ内の他のプリプロセス・トークンと同様、無視されます。 制御条件が真 (ゼロ以外の値) と評価される最初のグループのみが処理されます。 条件がいずれも真と評価されず、#else 指示があれば #else が制御するグループが処理されます。 #else 指示がなければ、#endif までの、すべてのグループがスキップされます。

フラグ

項目 説明
-C C 言語コメントをソース・ファイルから出力ファイルにコピーします。 このフラグを省略すると、cpp コマンドは cpp 指示行にあったものを除いたすべての C 言語コメントを除去します。
-DName[=Definition] Name#define ディレクティブとして定義します。 デフォルトの Definition1 です。
-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 オプションを使います。

  1. プリプロセッサーが C コンパイラーに送るテキストを表示するには、 以下のように入力します。
    
    /usr/ccs/lib/cpp pgm.c
    ここでは、pgm.c をプリプロセスして、結果として生成されるテキストをワークステーションで表示します。マクロ定義内のエラーを探す場合に、プリプロセッサーの出力を見ることができます。
  2. より読みやすくプリプロセスされたテキストが入っているファイルを作成するには、 以下のように入力します。
    /usr/ccs/lib/cpp -P -C pgm.c pgm.i
    これは、pgm.c をプリプロセスして、その結果を pgm.i に格納します。それはまた、C コンパイラー用の行番号情報を省略して (-P)、プログラム・コメント (-C) を組み込みます。
  3. マクロ ID を事前定義するには、以下のように入力します。
    /usr/ccs/lib/cpp -DBUFFERSIZE=512 -DDEBUG 
    pgm.c 
    pgm.i
    ここでは、プリプロセスを実行する前に、 値 512BUFFERSIZE を定義し、 値 1DEBUG を定義します。
  4. 非標準ディレクトリー内にある #include ファイルを使うには、 以下のように入力します。
    
    /usr/ccs/lib/cpp -I/home/jim/include 
    pgm.c
    ここでは、最初に現行ディレクトリー内で、 次に /home/jim/include 内で、 最後に標準ディレクトリー内で、 引用符付きの #include ファイルを探します。 また、最初に /home/jim/include 内で、次に標準ディレクトリー内で、不等号括弧付き (< >) の #include ファイルを探します。
  5. ANSI 定義を使ってプリプロセスを実行するには、以下のように入力します。
    /usr/ccs/lib/cpp -qlanglvl=ansi pgm.c

ファイル

項目 説明
/usr/include #include ファイルの標準ディレクトリー。