名前 | 形式 | 機能説明 | オプション | 使用法 | 終了ステータス | 属性 | 関連項目 | 診断 | 注意事項
cpp は、C 言語プリプロセッサです。cpp は、cc(1B) コマンドで開始される C プログラムのコンパイルにおける最初のパスとして起動されます。ただし、cpp は、他の Sun コンパイラの第 1 パスプリプロセッサとしても使用できます。
cpp はマクロプロセッサとしても使用できますが、その出力がコンパイラの第 2 パスへの入力として使用できる形式となっているため、一般にマクロプロセッサとしての使用はお勧めできません。したがって、cpp を起動するときは、cc(1B) コマンドか、または他のコンパイルコマンドを使用するようにしてください。汎用のマクロ処理については、m4(1) のマニュアルページを参照してください。
cpp は、オプションとして 2 つのファイル名を引数として受け付けます。input-file および output-file は、それぞれ、プリプロセッサ用の入力ファイルと出力ファイルです。デフォルトでは、標準入力と標準出力が使用されます。
次のオプションを指定できます。
C++ の注釈インジケータ / / を使用できるようにします。このインジケータを使用すると、/ / の後の行は注釈として扱われます。
すべての注釈 (cpp の指令行にあるものは除く) をそのまま渡します。デフォルトでは、cpp は C 言語スタイルの注釈を削除します。
インクルードファイルのパス名を、1 行に 1 つずつ標準エラー出力に出力します。
メイクファイル依存関係のリストを生成して、標準出力に書き込みます。このリストは、入力ファイルから生成されるオブジェクトファイルが、入力ファイルだけでなく、参照されるインクルードファイルにも依存することを示します。
最初の 8 文字だけを使用してプリプロセッサシンボルを識別し、指令を含む行の終わりに余分なトークンがあれば警告を発行します。
C コンパイラの次のパスで使用される行制御情報を生成せずに、入力を前処理します。
再帰マクロを可能にします。
最初の 8 文字だけを使用して、異なるプリプロセッサシンボルを識別します。このオプションは、常に最初の 8 文字だけを使用するシステムとの下方互換性のために提供されています。
事前定義されているすべてのシンボル初期定義を削除します。
name を 1と定義します。これは、cpp コマンド行に -Dname=1 オプションを指定した場合と同じです。
#define name 1
または、上記の行が cpp の処理するソースファイル内にある場合と同じです。
#define 指令と同様に name を定義します。これは、次の行が cpp の処理するソースファイル内にある場合と同じです。
#define name def
-D オプションは -U オプションよりも優先順位が低くなります。つまり、-U オプションと -D オプションの両方で同じ名前を使用した場合は、オプションの順序に関係なくその名前は定義されません。
/ 以外で始まる名前を持つ #include ファイルの検索パスに directory を挿入します。directory は、標準の include ディレクトリリストの前に挿入されます。したがって、名前が二重引用符 (") で囲まれた #include ファイルは、まず #include 行を含むファイルのあるディレクトリで検索され、次に -I オプションで指定されたディレクトリで検索されて、最後に標準リストのディレクトリで検索されます。名前が山括弧 (< > ) で囲まれた #include ファイルの場合、#include 行を含むファイルのあるディレクトリは検索されません。この検索順序の詳細については、以下の「詳細」を参照してください。
name の初期定義をすべて削除します。ここで、name は個々のプリプロセッサによって事前定義されたシンボルです。以下に、システムのアーキテクチャに応じて事前定義されているシンボルリストの一部を示します。
ibm、 gcos、os、 tss、 unix
interdata、 pdp11、 u370、u3b、 u3b2、 u3b5、u3b15、 u3b20d、 vax、ns32000、 iAPX286、 i386、 sparc、 sun
RESおよび RT
lint
シンボル sun、sparc、 unix は、すべての Sun システムで定義されています。
#include ファイルを検索する場合は、標準のディレクトリリストの代わりに、ディレクトリ directory を使用します。
すべての cpp 指令行は、ハッシュシンボル (#) で始まります。適切なインデンテーションを行うために、空白 (SPACE または TAB 文字) を # の後に入れることができます。
これ以降、name を token-string で置き換えます。
name と ( の間に空白を入れることはできません。括弧で囲んだ引数のリストが後に続く、以降の name を token-string で置き換えします。ここで、token-string 中の各 argument は、カンマで区切られたリスト内の対応するトークンで置き換えられます。引数を持つマクロが展開されると、引数は展開された token-string にそのまま入れられます。token-string 全体が展開されると、cpp は、新たに作成された token-string の先頭から、展開すべき名前の検索を再開します。
シンボル name の定義をすべて削除します。name の後の指令行には、トークンを付加することはできません。
この位置に filename の内容を読み込みます。このデータは、現在のファイルの一部であるかのように cpp によって処理されます。<filename> の表記法を使用すると、filename は標準の include ディレクトリのみで検索されます。詳細については、上記の -I および -Y オプションを参照してください。最後の `"' または `>' の後の指令行にはトークンを付加することはできません。
C コンパイラの次のパスのための行制御情報を生成します。integer-constant は次の行の行番号として解釈され、filename はその行を含むのファイルとして解釈されます。filename が指定されていない場合、現在のファイル名は変更されません。オプションの filename の後の指令行には、トークンを付加することはできません。
対応する #else、#elif、または #endif 指令までの後続行は、constant-expression が 0 以外の値に評価された場合にのみ出力されます。&&、| |、および , を含む、C 言語における代入以外のすべての 2 項演算子を、constant-expression 中で使用できます。?: 演算子と単項演算子 - と !、および ~ も constant-expression 中で使用できます。
これらの演算子の優先順位は、C における優先順位と同じです。また、単項演算子 defined は、2 つの形式で、constant-expression 中で使用できます。つまり、defined ( name ) または defined name の形式です。これにより、#ifdef および #ifndef の各ディレクトリ (下記参照) は #if 指令で有効になります。cpp によって認識されている演算子、整数定数、および名前だけを constant-expression 内で使用する必要があります。特に、size of 演算子は使用できません。
対応 #else、#elif、または #endif までの後続行は、name が#define 指令または -D オプションのいずれかによって定義されており、name が #undef 指令の対象となっていない場合にのみ出力されます。指令行上の name の後に付加されたトークンは無視されます。
対応する #else、#elif、または #endif までの後続行は、name が定義されていないか、あるいは、その定義が #undef 指令の対象となっていない場合にのみ出力されます。name の後の指令行には、トークンを付加することはできません。
#if、#ifdef、または #ifndef 指令と、対応する #else または #endif 指令の間には、任意の数の #elif 指令を置くことができます。#elif 指令に続く行は、次の条件がすべてあてはまる場合にのみ出力されます。
先行する #if 指令で constant-expression が 0 と評価され、先行する #ifdef で name が定義されていない、あるいは先行する #ifndef 指令で name が定義されていた。
すべての #elif 指令の対象となっている constant-expression が 0 に評価された。
現在の constant-expression が 0 以外に評価された。
constant-expression が 0 以外に評価された場合、後続の #elif と #else 指令は、対応する #endif まで無視されます。#if 指令で使用できる constant-expression はすべて、#elif 指令でも使用できます。
これは、条件指令の意味を反転します。つまり逆の意味になります。先行する条件指令が、行を含めることを示す場合、#else と対応する #endif の間の行は無視されます。先行する条件指令が、行を無視することを示す場合、後続の行は出力に含まれます。条件指令と対応する #else 指令はネストできます。
条件指令 #if、#ifdef、または #ifndef のいずれかによって開始した行セクションを終了します。このような各指令には、対応する #endif が必要です。
#define abc(a)| `|a| abc(xyz)
上記の指令の出力は次のとおりです。
# 1 "" | `|xyz |
2 番目の行は復帰改行です。最後の 7 文字は "| `|xyz |" (縦線、逆引用符、縦線、x、y、z、縦線) です。マクロ名は、通常の走査中は、文字定数や引用文字列内では認識されません。したがって、次の指令は、2 番目の行で abc を展開しません。これは、abc が、#define マクロ定義の一部ではない引用文字列内にあるためです。
#define abc xyz printf("abc");
マクロは、#define または #undef の処理中には展開されません。したがって、次の指令は abc を作成します。#ifdef または #ifndef のすぐ後にあるトークンは展開されません。
#define abc zingo #define xyz abc #undef abc xyz
マクロは、別のマクロ呼び出しへの実際のパラメータを判別する走査中は展開されません。したがって、次の指令は、「 #define hello goodbye hello」を生成します。
#define reverse(first,second)second first #define greeting hello reverse(greeting, #define greeting goodbye )
出力は入力ファイルのコピーからなり、変更が加えられており、次の形式の行が追加されています。
#lineno " filename " "level "
後続のの出力行の元のソース行番号とファイル名、および、これがインクルードファイルを入力した後の最初のそのような行であるか(レベル 1)、インクルードファイルが終了した後の最初のそのような行であるか (レベル 2)、あるいはそれ以外のそのような行であるか (level は空) を示します。
#include ファイルは、次の順序で検索されます。
#include 要求を含むファイルのディレクトリ (つまり #include は、要求が行われたときに、検索されているファイルに対応します)。
-I オプションで指定された複数のディレクトリ。左から右の順に検索されます。
標準ディレクトリ (UNIX システム上の /usr/include)
cpp は、2 つ特別な名前を認識します。名前__ _LINE_ __は、cpp が認識する現在の行番号 (10 進整数) として定義されます。_ _FILE_ __は、cpp が認識する現在のファイル名 (C 文字列) として定義されます。これらは、他の定義済み名と同様に、任意の場所 (マクロ内を含む) で使用できます。
NEWLINE 文字は、文字定数または引用文字列を終了します。エスケープされた NEWLINE 文字 (つまり、バックスラッシュが先行する NEWLINE) を #define 文の本体で使用すると、定義を次の行に続けることができます。エスケープされた NEWLINE は、マクロ値には含まれません。
注釈は削除されます (コマンド行に -C オプションが指定されている場合を除く)。また、注釈がトークンを終了する場合をのぞき注釈は、無視されます。
次の属性については、attributes(5) のマニュアルページを参照してください。
属性タイプ | 属性値 |
---|---|
使用条件 | SUNWsprot |
cpp によって生成されるエラーメッセージは、読めばわかるものです。エラーが発生した行番号とファイル名が、診断と共に出力されます。
NEWLINE 文字が、展開されるマクロの引数リストで検出された場合、以前のバージョンの cpp の中には、NEWLINE 文字が検出されて展開された場合のように、NEWLINE文字を出力するものがあります。現在のバージョンの cpp は、NEWLINE文字を SPACE 文字で置き換えします。
インクルードファイルの標準ディレクトリは環境によって異なる場合があるため、次の形式の #include 指令を使用する必要があります。
#include <file.h>
次のような絶対パスを使用する #include 指令は使用しないようにしてください。
#include "/usr/include/file.h"
cpp は、絶対パス名が使用されていれば警告を出します。
コンパイラでは 8 ビットの文字列と注釈を使用できますが、コンパイラ以外では 8 ビットは使用できません。
SunOS 5.9 最終更新日 1999年12月1日名前 | 形式 | 機能説明 | オプション | 使用法 | 終了ステータス | 属性 | 関連項目 | 診断 | 注意事項