構文
/usr/ccs/lbin/cpp [option...] [ifile [ofile]]
説明
cpp は、 cc コマンド ( cc(1) を参照) を使用したとき、C コンパイルの最初のパスとして起動される C 言語プリプロセッサです。
これは、 #include や条件コンパイル命令、およびマクロを処理するために使用されます。
したがって、 cpp の出力の形式は、C コンパイラの次のパスに対する入力として受入れ可能なように設計されています。
C 言語が発展するにつれ、 cpp やその他の C コンパイルパッケージはこれらの変更に従うように修正されています。
したがって、 cpp をこれ以外の方法で使用しないようにしてください。 cpp の機能はいつか別の場所に移される可能性があるため、 cc コマンドを使用して cpp を実行するようにお勧めします。
汎用マクロプロセッサについては、 m4(1) を参照してください。
cpp はオプションにより 2 つのファイル名を引き数として任意に受け付けます。 ifile と ofile は、それぞれプリプロセッサの入出力です。 指定されなければ、これらのデフォルトは標準入力および標準出力になります。
オプション
cpp では、以下のオプションが認識されます。
| -A | | 英字および _HPUX_SOURCE から始まる定義済みシンボルをすべて削除します。
ユーザーは、このオプションを使用する際に、 _POSIX_SOURCE または _XOPEN_SOURCE を定義するようにしてください。 |
| -C | | デフォルトでは、 cpp は C スタイルのコメントを取り除きます。 -C オプションを指定すると、すべてのコメント ( cpp の指令行にあるものは除く) が渡されます。 |
| -Dname | | |
| -Dname=def | | #define 指令によるかのように定義します。 =def を与えなければ、 name は 1 として定義されます。 -D オプションの優先順位は -U オプションより下位です。
したがって、同じ名前を -U オプションと -D オプションの両方で使用すると、
名前はオプションの順序とは関係なく未定義となります。 |
| -Hnnn | | 内部マクロ定義テーブルのサイズが nnn バイトになるように変更します。 デフォルトのバッファサイズは、最低
8 188 バイトです。 このオプションは、 ``Macro param too large''、``Macro
invocation too large''、 ``Macro param too large after substitution''、
``Quoted macro param too large''、``Macro buffer too small''、 ``Input
line too long''、および ``Catenated input line too long'' といったエラーを取り除くために使用されます。 |
| -h[inclfile] | | インクルードされるファイルを作成し、その結果を inclfile というファイルに出力します。 引き数 inclfile を省略した場合、結果は標準エラーに出力されます。 |
| -Idir | | 名前が / で始まらない #include ファイルを探すアルゴリズムを、
標準リストにあるディレクトリを探す前に dir を調べるように変更します。 したがって、名前が二重引用符
("") で囲まれている #include ファイルは、最初に #include 行のあるファイルのディレクトリ、次に左から右順の -I オプションで指定されているディレクトリ、
最後に標準リストのディレクトリから探されます。 名前がかぎ括弧 (<>) で囲まれた #include ファイルの場合、 #include 行のあるファイルのディレクトリが探されません。
ただし、ディレクトリ dir は、引続き探されます。 |
| -M[makefile] | | メイクファイルの依存関係を定義し、その結果を makefile というファイルに出力します。 引き数 makefile を省略した場合、結果は標準エラーに出力されます。. |
| -P | | C コンパイラの次のパスによって使用される行制御情報を作成せずに、入力をプリプロセッシングします。 |
| -T | | HP-UX はプリプロセッサシンボルを 8 文字までに制限しません。 -T オプションにより、 cpp は、異なるプリプロセッサ名を区別するために最初の 8 文字のみを使用します。
この動作は、名前の長さに関しては その他のシステムのプリプロセッサと同じであり、互換性のために含まれています。
|
| -Uname | | name の初期定義を削除します。 ただし、 name は特定のプリプロセッサによって事前に定義されている予約シンボルです。
これらのシンボルの現在のリストとしては、以下のものがあります。 | オペレーティングシステム: | | unix __unix | | ハードウェア: | | hp9000s200 hp9000s300 __hp9000s300 hp9000s500 hp9000s800 __hp9000s800 hp9000ipc hppa __hppa _PA_RISC1_0 _PA_RISC1_1 _SIO _WSIO | | UNIX システムのバリエーション: | | | | hpux __hpux _HPUX_SOURCE PWB _PWB | | lint(1): | | lint __lint |
さらに、アンダースコアおよび大文字英字または 2 つののアンダースコアのいずれかで始まるシンボルはすべて予約されています。
その他のシンボルは、 CCOPTS 変数または C コンパイラに対する他のコマンド行オプションによってコンパイル時に
定義することができます ( cc(1) を参照)。 すべての HP-UX
システムでは、シンボル PWB, hpux, unix, _PWB, __hpux,
および __unix が定義されています。 各システムで、最適な、少なくとも 1 つのハードウェアバリエーションを定義します。 lint(1) の動作時には
lint シンボルが定義されます。 『制約』 を参照してください。 |
2 つの特殊な名前が cpp によって理解されます。 __LINE__ は、 cpp によってカウントされている現在の行番号 (10 進整数) として定義されます。 __FILE__ は、 cpp によって知られている現在のファイル名 (C 文字列) として定義されます。
これらは、別の定義済みの名前とちょうど同じように (マクロ内を含む) 任意の位置で使用することができます。
指令
cpp 指令はすべて # によって始まる行から始まります。
任意個数の空白およびタブを # と指令の間に入れることができます。
指令は次の通りです。
| #define name token-string |
| | | name の次のインスタンスを token-string で置き換えます。 token-string はヌルにすることができます。 |
| #define name(arg, ... , arg) token-string |
| | | name の後にあり、 ( 、カンマで区切った引き数のセットのリスト、および、 ) が続くインスタンスを token-string に置き換えます。 ただし、 token-string 中にある arg はそれぞれ、コンマで区切ったリストにある対応するトークンのセットで置き換えられます。
引き数の付いたマクロを展開すると、 引き数は展開された token-string にそのまま書き込まれます。 token-string 全体を展開した後で、 cpp は新たに作成された token-string の先頭から展開する名前の走査を再開します。 name と ( の間にスペースを入れることはできないことに注意してください。 |
| #endif [text] | | テスト指令 (#if, #ifdef,
または #ifndef). で始まる行のセクションを終了させます。
各テスト指令には、それに対応する #endif がなければなりません。 #endif と同じ行にある text は無視されるため、対応する #if-#endif ペアをマークするために使用することができます。
これにより、ソースを読み込む際、 #if, #ifdef, #ifndef 指令をこれに対応する #endif に対応させるのが簡単になります。 |
| #elif constant-expression |
| | | #else #if constant-expression と同じ。 |
| #else | | この指令に対応するテスト指令の概念を反転します。
したがって、この指令の前の行を無視している場合には、 次の行が出力に現れます。逆もまた同じです。 |
| #if constant-expression |
| | | 次の行は、 constant-expression の評価値がゼロ以外になる場合に限って、出力に現れます。
すべての代入以外の c 言語の 2 項演算子、 ?: 演算子、単項 -, !,
および ~ 演算子は、すべて constant-expression で使用可能です。 演算子の優先順位は、C 言語によって定義された順位と同じです。 また、単項演算子 defined もあります。 これは、次の 2 つの形式 defined(name) または defined name により constant-expression で使用できます。 これにより、 #if 指令で #ifdef と #ifndef を使用することができます。 cpp が対応可能なこれらの演算子、整数定数、および名前のみを constant-expression で使用するようにしてください。 特に、 sizeof 演算子は利用できません。 |
| #ifdef name | | 次の行は、事前に #define によって name が定義され、間に #undef が定義されていない場合に限り、出力が現れます。 |
| #ifndef name | | 次の行は、事前に #define によって name が定義され、間に #undef が定義されていない場合に限り、出力が現れません。 |
| #include "filename" |
| | | |
| #include <filename> |
| | | この時点で filename の内容をインクルードします (これは、次に cpp によって実行されます)。
詳細については、上記の -I オプションを参照してください。 |
| #line integer-constant "filename" |
| | | cpp は、C コンパイラの次のパスの行制御情報を生成します。 integer-constant は次の行の行番号であり、 filename は元のファイルです。 filename と二重引用符を省略した場合、現在のファイル名は不変です。 |
| #undef name | | name (を定義してあれば) の定義を今後行いません。 |
テスト指令および可能な #else 指令は、ネストすることができます。 cpp は、長さが最大 255 文字までの名前をサポートします。
注記
マクロの置き換え方法が変更されました。旧バージョンの cpp は、マクロをマクロ定義テーブルに保存しました。また、テーブルのサイズは、デフォルトで
128 000 バイトでした。 現在のバージョンの cpp は、マクロ定義テーブルをいくつかの小さなバッファに置き換えます。それらのバッファのデフォルトのサイズは、8 188
バイトです。
多言語化対応
環境変数
LC_CTYPE により、コメントや文字列リテラルを、シングルバイト
またはマルチバイトのいずれの文字で解釈するかを決定します。 LANG により、メッセージの表示に使用する言語を決定します。
現在使用している環境において、 LC_CTYPE が指定されていない場合や、 LC_CTYPE に空の文字列が設定されている場合には、 LANG の値がその変数のデフォルトとして用いられます。 LANG が指定されていなかったり、空の文字列が指定されている場合のデフォルト値は、"C"( lang(5) を参照) です。 国際変数のいずれかの設定が不適切な場合には、 cpp はすべての国際変数が"C"に設定されているものとして動作します。 environ(5) を参照してください。
サポートされる国際的コードセット
シングル/マルチバイトの文字コードセットがサポートされています。
診断
cpp によって作成されるエラーメッセージは読めば自己診断できます。
エラーが発生した行番号とファイル名が、診断とともにプリントされます。
警告
展開されるマクロの引き数リストに改行文字が存在する場合、旧バージョンの cpp は、改行文字が検出されたり展開されたりしたときにその改行文字を無視します。現在のバージョンの cpp は、これらの改行文字が空白に置き換えられ、このような場合に旧バージョンで発生していた問題が改善されています。
制約
ワークステーション
シンボル hp9000s700 と __hp9000s700 は -U オプションで認識される予約シンボルではありません。
これらは、コンパイラによって自動的に、またはコンパイラオプションを使用して cpp に与えられます。
例えば、ワークステーション上では、
というコマンドを実行した結果は、次のようになります。
/usr/ccs/lbin/cpp t.c /var/tmp/ctmAAAa29220 -D__hp9000s700
-D__hp9000s800 ...
( cc コマンドの -D オプションについての説明も参照してください)
ファイル
| /usr/include | | #include ファイルの標準ディレクトリ |
標準準拠
cpp: SVID2, SVID3, XPG2