スポンサーリンク

cpp

名称
書式
解説
オプション
関連項目
COPYING

名称

cpp − GNU-C 互換のコンパイラプリプロセッサ

書式

cpp

[−$] [−Apredicate[(value)]] [−C] [−Dname[=definition]] [−dD] [−dM] [−I directory] [−H] [−I−] [−imacros file] [−include file] [−idirafter dir] [−iprefix prefix] [−iwithprefix dir] [−lang−c] [−lang−c++] [−lang−objc] [−lang−objc++] [−lint] [−M [−MG]] [−MM [−MG]] [−MD file ] [−MMD file ] [−nostdinc] [−nostdinc++] [−P] [−pedantic] [−pedantic−errors] [−traditional] [−trigraphs] [−Uname] [−undef] [−Wtrigraphs] [−Wcomment] [−Wall] [−Wtraditional]

[infile|] [outfile|]

解説

C プリプロセッサは、実際のコンパイルの前にプログラムを変換するために C コンパイラから自動的に利用される マクロプロセッサです。長い記述を簡略し てマクロとして定義することができるため、マクロプロセッサと呼ばれます。

C プリプロセッサは、以下の4つの機能を提供します。

ヘッダファイルを読み込みます。これはプログラムに組み込まれる (C 言語の)宣言の入ったファイルです。

C 言語の任意の部分の省略形として マクロを定義し、C プリプロ セッサがプログラム内の全てのマクロをその定義で置き換えます。

条件文の処理をします。専用のプリプロセッサコマンドを用いて、 い ろいろな条件にしたがってプログラムの一部を含めたり除外したり できます。

行番号の制御をします。ソースファイルとコンパイルされた 中 間 ファ イルとを組み合わせたり再アレンジしたりするプログラムを用い る場合、コンパイラにオリジナルのソースの何行目であるかを知ら せ るための、行番号制御のプリプロセッサコマンドを利用できます。

C プリプロセッサは、そのインプリメントによって細かな部分に違いがいくつ かあります。GNU C プリプロセッサの完全なドキュメントは、 info ファイ ル の ‘cpp.info’, もしくは、マニュアルの The C Preprocessorを参照して下さ い。この双方は ‘cpp.texinfo’から生成されます。GNU C プリプロ セッ サ は ANSI Standard C のスーパセットとなっています。

ANSI Standard C では、今日 C プログラムで一般的に用いられている多くの ( 無害な)構造が認められていません。この非互換性はユーザにとっては不便であ り、 そのため GNU C preprocessor ではこの記述をデフォルトで受け付けるよ うに作られています。厳密にいえば、 ANSI Standard C にするためには オ プ ショ ンとして ‘−trigraphs’, ‘−undef’, ‘−pedantic’をつけなければなりませ ん。しかし経験則から、厳密な ANSI Standard C にあわせてこうした設定を行 なうと支障のある場合が多いことがわかっています。

ほ とんどの場合は、C プリプロセッサは明示的に実行する必要はありません。 C コンパイラが自動的に実行してくれるからです。しかしながら、明示的に プ リプロセッサを実行するのが有効なことが個々にはあります。

C プリプロセッサは、引数として infileoutfileの 2 つのファイル名を期 待します。プリプロセッサは ‘#include’で指定したファイルと一緒に infile を 読み込みます。入力ファイルの組み合わせで作られた出力は、全て outfile に書かれます。

infileoutfile の指定に ‘’を使用することができます。infile が ‘’ で あれば 標準入力からデータを読み、outfile が ‘’ であれば標準出力へ結 果を書きます。もし outfile もしくは両方のファイル名が省略された場合、省 略されたファイルの代わりに標準入力と標準出力が使われます。

オプション

以 下 が C プリプロセッサが受け付けるオプションの一覧です。これらのオプ ションは、プリプロセッサがコンパイラから起動されている場合にも自動的 に 引き渡されるので、 C プログラムをコンパイルする際にも指定することができ ます。

−P

#’-行番号という行番号情報をプリプロセッサの出力に含めま せ ん。 これは、C 以外の言語で行番号情報が含まれているとエラーを起 こす言語を処理する場合に有用でしょう。

−C

コメントを削除せず、そのまま出力ファイルに含めます。マク ロ 呼 び出しの引数に現れるコメントはマクロ呼び出しの展開後にコピー されます。

-traditional

ANSI ではなく、旧形式の C の文法として解釈します。

-trigraphs

ANSI標準のトリグラフ(trigraph)構文を処理します。これは ANSI C で 1 文字を表示すると定められた ‘??’ で始まる 3 文字の並びで す。例えば、‘??/’ は ‘\’ を表しますので、‘’??/n’’ は改行文字 の 文 字 定 数 と な り ます。厳密に言えば、GNU C プリプロセッサの ‘−trigraphs’ オプションは ANSI C 標準を完全にはサポートし ま せ ん。が、普通のユーザならばその違いに気づく事は稀でしょう。

トリグラフについて、これ以上知りたいとは思わないでしょ?

−pedantic

#else’ や ‘#endif’ の後にコメント以外のテキストがつくといった 場合に、 ANSI C 標準で求められる警告を出力します。

−pedantic−errors

−pedantic’ に似ていますが、警告ではなくエラーにします。

−Wtrigraphs

トリグラフがあると警告を出力します(ただし、トリグラフの処理は行 います)。

−Wcomment

−Wcomments

コ メント開始シーケンスである ‘/*’ がコメント中に存在したならば 警告を発生します (両形式は同じ効果を持ちます)。

−Wall

−Wtrigraphs’ と ‘−Wcomment’ (ただし ‘−Wtraditional’ は 除く) を指定したのと同じです。

−Wtraditional

ANSI と伝統派の C とで異なる振る舞いをとる構文が出現した場合に 警告を発します。

−I directory

ディレクトリ directory をヘッダファイルを検索するディレクト リ リ ストの末尾に追加します。このオプションは、指定したディレクト リがシステムのヘッダファイルが格納されているディレクトリより も 先 に検索されるので、ユーザ自身の作成したバージョンでシステムが 提供するヘッダファイルを上書きさせることもできます。 1 つ以上の ‘−I’ オプションを使用する場合、ディレクトリは左から右の順番で検 索され、標準のシステムヘッダファイルはその後になります。

−I−

−I−’ オプションよりも前に指定された ‘−I’ オプションで与え ら れたディレクトリは、‘#include "file"’ のインクルード文の場合 にのみ検索されます。‘#include <file>’ では検索されません。

オプション ‘−I−’ の後のオプション ‘−I’ に追加のディレクトリが指 定 された場合、それらのディレクトリは全ての ‘#include’ 文で検索 されます。

付け加えて言うならば、‘−I−’ オプションを指定すると、カ レ ン ト ディレクトリは ‘#include "file"’ 文に対する最初の検索ディレクト リではなくなります。それゆえ、カレントディレクトリは明 示 的 に ‘−I.’ と し て 指定された場合にのみ検索されることになります。 ‘−I−’ と ‘−I.’ を双方とも指定することで、どのディレクトリがカレ ン トディレクトリの前に、あるいは後に検索されるかを厳密に指定す ることができます。

−nostdinc

ヘッダファイルの検索に標準システムディレク ト リ を 用 い ま せ ん。‘−I’ オプションで指定したディレクトリ(と、もし適切であるな らばカレントディレクトリ)が検索されます。

−nostdinc++

ヘッダファイルの検索に C++ 仕様の標準ディレクトリを用いません。 が、 そ の 他の標準ディレクトリは検索します。 (このオプションは libg++ の構築時に用いられます。)

−D name

name を既定義のマクロとして、‘1’ に定義します。

−D name=definition

name をマクロとしてdefinition に定義します。definition の内 容 に 制限はありませが、プリプロセッサをシェルやシェルに類似したプ ログラムから起動している場合、シェルの文法上意味を持つスペー ス な どの文字を保護するため、そのシェルのクォート文法を使用する必 要があります。もし、1 つの name に対して複数の ‘−D’ を指定し た ならば、もっとも右側の定義が有効となります。

−U name

name を定義しません。同一の name に対して ‘−U’ と ‘−D’ の双方 が指定された場合、‘−U’ が ‘−D’ に優先し、 name は定義されま せ ん。

−undef

非標準のマクロを一切定義しません。

−A name(value)

(#assert コ マ ン ドと同じ方法で) 述語 name にトークンリスト value をアサートします。シェルのコマンドライン上では括弧をエ ス ケープするなりクォートすることを忘れないで下さい。

既 定義のアサーション全てを取り消すのに、‘−A-’ を使えます。これ はまた、既定義のマクロ全てを無効にします。

−dM

プリプロセッサの結果を出力する代わりに、プリプロセッサの実 行中に定義された、既定義のものも含む全てのマクロの ‘#define’ コ マンドのリストを出力します。これは、使用しているプリプロセッ サ の そのバージョンで、どんなマクロが既定義であるかを知る方法を提 供してくれます。それには、空のファイル ‘foo.h’ をこのオプション で処理してみればよいのです。

touch foo.h; cpp −dM foo.h

はすべての既定義マクロの値を見せてくれるでしょう。

−dD

−dM’ に似ていますが、2 つの相違点があります。これは既定義 マクロを出力しません。また、‘#define’ コマンドとプリプロセス 結 果の双方 を出力します。これらの出力は両方とも標準出力に行われま す。

−M [−MG]

プリプロセスの結果を出力する代わりに、main のソースファイルの依 存性を記述するmake 規則を出力します。プリプロセッサはソースファ イルのオブジェクトファイル名、コロン、そのすべてのインクルー ド ファイル名から成るmake 規則を出力します。複数のインクルードファ イルがある場合、規則は‘\’-改行で複数行に区切られます。

−MG’ は、見つけられなかったヘッダファイルは(コンパイルの 途 中 で)生成され、ソースファイルと同じディレクトリに存在するものとし て扱います。‘−M’ と共に指定しなければなりません。

この機能は自動的に Makefile を更新するのに使います。

−MM [−MG]

これは ‘−M’ に似ていますが、‘#include "file"’ でインクルード さ れ るファイルのみを扱う点が異なります。‘#include <file>’ でイン クルードされるシステムヘッダファイルは無視されます。

−MD file

これも ‘−M’ に似ていますが、依存情報が‘file’ に書き 出 さ れ ま す。—‘−MD’ を指定したファイルの処理もこれに加えて行われ、‘−M’ のように通常の処理を抑制することはありません。

gcc を実行する場合は ‘file’ 引数を指定してはい け ま せ ん。gcc は、 入力ファイル名の末尾の ‘.c’ を ‘.d’ で置き換えたファイル名 を出力に用いるからです。

Mach では、‘make’ コマンドで便利なように複数のファイルを 1 つの 依存規則ファイルにまとめるユーティリティ md が利用できます。

−MMD file

−MD’ に似ていますが、ユーザのヘッダファイルのみを扱い、システ ムヘッダは無視する点が異なります。

−H

通常の動作に加えて、使用されたヘッダファイルのファイル名 を 出力します。

−imacros file

ファイル file を入力として処理しますが、標準の入力ファイルを 処理する前にその結果の出力を破棄します。 file によって生成さ れ る 出 力 は 捨 て ら れるため、‘−imacros file’ の処理結果の影響 は、file 中に記述されたマクロがメインの入力ファイル中で使用可能 に なることだけです。プリプロセッサは、‘−imacros file’ を処理す る前に、コマンドラインから与えられた全ての ‘−D’ や ‘−U’ オ プ ションを評価します。

−include file

ファイル file を、標準の入力ファイルの前に処理し、その結果出 力をインクルードします。

−idirafter dir

ディレクトリ dir を第 2 インクルードパスに加えます。第 2 インク ルー ドパス中のディレクトリは、メインインクルードパス (オプショ ン ‘−I’ によって追加されます) 中にヘッダファイルを探した結果 発 見できなかった場合に検索されます。

−iprefix prefix

prefix を、その後に続く ‘−iwithprefix’ オプション用のプレフィッ クスとして使用します。

−iwithprefix dir

ディレクトリを第 2 インクルードパスに追加します。ディレクトリ名 は prefixdir を連結することによって得られます。ここで prefix は ‘−iprefix’ オプションによって指定されたものです。

−lang-c

−lang-c++

−lang-objc

−lang-objc++

ソースの言語を指定します。‘−lang-c++’ は、プリプロセッサに C++ の コメント文と、C++ 用の追加のデフォルトインクルードディレクト リを処理させ、‘−lang-objc’ は、Objective C の ‘#import’ ディ レ ク ティブを使用可能にします。‘−lang-c’ は明示的にこれらの機能の 切り離しを指定し、‘−lang-objc++’ は双方を利用可能にします。

これらのオプションはコンパイラドライバ gcc によって生成されます が、‘gcc’ のコマンドラインから引き渡すことはできません。

−lint

コメント中に埋め込まれた、プログラムチェッカ lint のコ マンドを見つけ出し、それらの前に ‘#pragma lint’ を埋め込 み ま す。 例 え ば、 コ メ ント ‘/* NOTREACHED */’ は ‘#pragma lint NOTREACHED’ になります。

このオプションは直接 cpp を呼び出す場合にのみ使えます。gcc は、 コマンドラインからこのオプションを引き渡しません。

−$

識別子中での ‘$’ の使用を禁止します。これは、標準が修正され る以前は、C 標準への厳密な準拠のためにありました。

本オプションは、 cpp を直接呼ぶときのみ使用可能です。 gcc は コ マンド行からこれを渡しません。

関連項目

info; The C Preprocessor, Richard M. Stallman. 中のエントリ ‘cpp
gcc
(1); info; Using and Porting GNU CC (for version 2.0), Richard M. Stallman. 中のエントリ ‘gcc

COPYING

Copyright (c) 1991, 1992, 1993 Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.

Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.

スポンサーリンク