Go to main content

マニュアルページ セクション 1: ユーザーコマンド

印刷ビューの終了

更新: 2022年7月27日
 
 

cpp(1)

名前

cpp - C 言語プリプロセッサ

形式

/usr/lib/cpp [-BCHMpPRT] [-undef] [-Dname] [-Dname = def] 
     [-Idirectory] [-Uname] [-Ydirectory] 
     [input-file [output-file]]

説明

cpp は、C 言語プリプロセッサです。cpp は、ほかの Sun コンパイラの第 1 パスプリプロセッサとしても使用されます。

cpp はマクロプロセッサとしても使用できますが、その出力がコンパイラの第 2 パスへの入力として使用できる形式となっているため、一般にマクロプロセッサとしての使用はお勧めできません。このため、コンパイルコマンドの使用が cpp の望ましい呼び出し方法です。汎用のマクロ処理については、m4(1) を参照してください。

cpp は、オプションとして 2 つのファイル名を引数として受け入れます。input-file および output-file は、それぞれ、プリプロセッサ用の入力ファイルと出力ファイルです。デフォルトでは、標準入力と標準出力が使用されます。

オプション

サポートしているオプションは、次のとおりです。

–B

C++ の注釈インジケータ / / をサポートします。このインジケータを使用すると、/ / の後の行は注釈として扱われます。

–C

すべての注釈 (cpp の指令行にあるものは除く) をそのまま渡します。デフォルトでは、cpp は C 言語スタイルの注釈を削除します。

–H

インクルードファイルのパス名を、1 行に 1 つずつ標準エラー出力に出力します。

–M

メイクファイル依存関係のリストを生成して、標準出力に書き込みます。このリストは、入力ファイルから生成されるオブジェクトファイルが、入力ファイルだけでなく、参照されるインクルードファイルにも依存することを示します。

–p

最初の 8 文字だけを使用してプリプロセッサシンボルを識別し、指令を含む行の終わりに余分なトークンがあれば警告を発行します。

–P

C コンパイラの次のパスで使用される行制御情報を生成せずに、入力を前処理します。

–R

再帰マクロを可能にします。

–T

最初の 8 文字だけを使用して、異なるプリプロセッサシンボルを識別します。このオプションは、常に最初の 8 文字だけを使用するシステムとの下方互換性のために提供されています。

–undef

事前定義されているすべてのシンボル初期定義を削除します。

–Dname

name1 と定義します。これは、cpp コマンド行に –Dname=1 オプションを指定した場合と同じです。または、

#define name 1

の行が cpp の処理するソースファイル内にある場合と同じです。

–Dname=def

#define 指令と同様に name を定義します。これは、

#define name def

の行が cpp の処理するソースファイル内にある場合と同じです。–D オプションは –U オプションよりも優先順位が低くなります。つまり、–U オプションと –D オプションの両方で同じ名前を使用した場合は、オプションの順序に関係なくその名前は定義されません。

–Idirectory

/ 以外で始まる名前を持つ #include ファイルの検索パスに directory を挿入します。directory は、標準の include ディレクトリリストの前に挿入されます。したがって、名前が二重引用符 (") で囲まれた #include ファイルは、まず #include 行を含むファイルのあるディレクトリで検索され、次に –I オプションで指定されたディレクトリで検索されて、最後に標準リストのディレクトリで検索されます。名前が山括弧 (< > ) で囲まれた #include ファイルの場合、#include 行を含むファイルのあるディレクトリは検索されません。この検索順序の詳細については、以下の「詳細」を参照してください。

–Uname

name の初期定義をすべて削除します。ここで、name は個々のプリプロセッサによって事前定義されたシンボルです。以下に、システムのアーキテクチャーに応じて事前定義されているシンボルリストの一部を示します。

オペレーティングシステム:

ibm, gcos, os, tss and unix

ハードウェア:

interdatau3b20d ns32000i386sparc、および sun

UNIX システムからの派生:

RES および RT

lint コマンド:

lint

シンボル sunsparcunix は、すべての Sun システムで定義されています。

–Ydirectory

#include ファイルを検索する場合は、標準のディレクトリリストの代わりに、ディレクトリ directory を使用します。

使用法

指令

すべての cpp 指令行は、ハッシュシンボル (#) で始まります。適切なインデンテーションを行うために、スペース (SPACE または TAB 文字) を # の後に入れることができます。

#define name token-string

これ以降、nametoken-string で置き換えます。

#define name(argument [, argument] . . .) token-string

name( の間にスペースを入れることはできません。括弧で囲んだ引数のリストが後に続く、以降の nametoken-string で置き換えします。ここで、token-string 中の各 argument は、コンマで区切られたリスト内の対応するトークンで置き換えられます。引数を持つマクロが展開されると、引数は展開された token-string にそのまま入れられます。token-string 全体が展開されると、cpp は、新たに作成された token-string の先頭から、展開すべき名前の検索を再開します。

#undef name

シンボル name の定義をすべて削除します。name の後の指令行には、トークンを付加することはできません。

#include "filename "
#include < filename>

この位置に filename の内容を読み込みます。このデータは、現在のファイルの一部であるかのように cpp によって処理されます。<filename > の表記法を使用すると、filename は標準の include ディレクトリのみで検索されます。詳細については、前述の –I および –Y オプションを参照してください。最後の " または > の後の指令行にはトークンを付加することはできません。

#line integer-constant "filename"

C コンパイラの次のパスのための行制御情報を生成します。integer-constant は次の行の行番号として解釈され、filename はその行を含むファイルとして解釈されます。filename が指定されていない場合、現在のファイル名は変更されません。オプションの filename の後の指令行には、トークンを付加することはできません。

#if constant-expression

対応する #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 演算子は使用できません。

#ifdef name

対応 #else#elif、または #endif までの後続行は、name#define 指令または –-D オプションのいずれかによって定義されており、name が #undef 指令の対象となっていない場合にのみ出力されます。指令行上の name の後に付加されたトークンは無視されます。

#ifndef name

対応する #else#elif、または #endif までの後続行は、name が定義されていないか、あるいは、その定義が #undef 指令の対象となっていない場合にのみ出力されます。name の後の指令行には、トークンを付加することはできません。

#elif constant-expression

#if#ifdef、または #ifndef 指令と、対応する #else または #endif 指令の間には、任意の数の #elif 指令を置くことができます。#elif 指令に続く行は、次の条件がすべてあてはまる場合にのみ出力されます。

  • 先行する #if 指令で constant-expression が 0 と評価され、先行する #ifdefname が定義されていない、あるいは先行する #ifndef 指令で name が定義されていた

  • すべての #elif 指令の対象となっている constant-expression が 0 に評価されました。

  • 現在の constant-expression が 0 以外に評価されました。

constant-expression0 以外に評価された場合、後続の #elif#else 指令は、対応する #endif まで無視されます。#if 指令で使用できる constant-expression はすべて、#elif 指令でも使用できます。

#else

これは、条件指令の意味を反転します。つまり逆の意味になります。先行する条件指令が、行を含めることを示す場合、#else と対応する #endif の間の行は無視されます。先行する条件指令が、行を無視することを示す場合、後続の行は出力に含まれます。条件指令と対応する #else 指令はネストできます。

#endif

条件指令 #if#ifdef、または #ifndef のいずれかによって開始した行セクションを終了します。このような各指令には、対応する #endif が必要です。

マクロ

マクロの正規パラメータは、文字定数や引用文字列内で発生する場合でも、#define 指令の本体で認識されます。たとえば、次の指令を見てください。


#define abc(a)|`|a|
abc(xyz) 

出力は次のようになります。

# 1 ""
|`|xyz |

2 番目の行は復帰改行です。最後の 7 文字は |`|xyz| (縦線、逆引用符、縦線、x、y、z、縦線) です。マクロ名は、通常の走査中は、文字定数や引用文字列内では認識されません。したがって、

#define abc xyz
printf("abc");

前述の指令は、2 番目の行で abc を展開しません。これは、abc が、#define マクロ定義の一部ではない引用文字列内にあるためです。

マクロは、#define または #undef の処理中には展開されません。したがって、


#define abc zingo
#define xyz abc
#undef abc
xyz

前述の指令は abc を作成します。#ifdef または #ifndef のすぐ後にあるトークンは展開されません。

マクロは、別のマクロ呼び出しへの実際のパラメータを判別する走査中は展開されません。


#define reverse(first,second)second first
#define greeting hello
reverse(greeting,
#define greeting goodbye
)

の出力は次のようになります。

#define hello goodbye  hello

出力

出力は入力ファイルのコピーからなり、変更が加えられており、次の形式の行が追加されています。

#lineno " 
filename" "level
"

後続の出力行の元のソース行番号とファイル名、および、これがインクルードファイルを入力した後の最初のそのような行であるか (レベル 1)、インクルードファイルが終了した後の最初のそのような行であるか (レベル 2)、あるいはそれ以外のそのような行であるか (level は空) を示します。

詳細

このセクションでは、使用法の詳細を示します。

ディレクトリの検索順序

#include ファイルは、次の順序で検索されます。

  1. #include 要求を含むファイルのディレクトリ (つまり #include は、要求が行われたときに、検索されているファイルに対応します)。

  2. –I オプションで指定された複数のディレクトリ。左から右の順に検索されます。

  3. 標準ディレクトリ (UNIX システム上の /usr/include)

特殊名

cpp は、2 つ特別な名前を認識します。名前 _ _LINE_ _ は、cpp が認識する現在の行番号 (10 進整数) として定義されます。_ _FILE_ _ は、cpp が認識する現在のファイル名 (C 文字列) として定義されます。これらは、他の定義済み名と同様に、任意の場所 (マクロ内を含む) で使用できます。

改行文字

NEWLINE 文字は、文字定数または引用文字列を終了します。エスケープされた NEWLINE 文字 (つまり、バックスラッシュが先行する NEWLINE) を #define 文の本体で使用すると、定義を次の行に続けることができます。エスケープされた NEWLINE は、マクロ値には含まれません。

注釈

注釈は削除されます (コマンド行に –C オプションが指定されている場合を除く)。また、注釈がトークンを終了する場合をのぞき注釈は、無視されます。

終了ステータス

次の終了ステータスが返されます。

0

正常終了。

0 以外

エラーが発生しました。

属性

次の属性については、attributes(7) を参照してください。

属性タイプ
属性値
使用条件
developer/build/make

関連項目

m4(1), attributes(7)

診断

cpp によって生成されるエラーメッセージは、読めばわかるものです。エラーが発生した行番号とファイル名が、診断と共に出力されます。

NEWLINE 文字が、展開されるマクロの引数リストで検出された場合、以前のバージョンの cpp の中には、NEWLINE 文字が検出されて展開された場合のように、NEWLINE 文字を出力するものがあります。現在のバージョンの cpp は、NEWLINE 文字を SPACE 文字で置き換えします。

インクルードファイルの標準ディレクトリは環境によって異なる場合があるため、次の形式の #include 指令を使用する必要があります。

#include <file.h>

次のような絶対パスを使用する #include 指令は使用しないようにしてください。

#include "/usr/include/file.h"

cpp は、絶対パス名が使用されていれば警告を出します。

コンパイラでは 8 ビットの文字列と注釈を使用できますが、コンパイラ以外では 8 ビットは使用できません。