Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

cc(1)

as(1)

pc(1)

f77(1)

m4(1)

CPP(1)  —  NEWS-OS Programmer’s Manual

名称

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

形式

/usr/lib/cpp [ option ...  ] [ ifile [ ofile ] ]

解説

cpp は C 言語プリプロセッサであり、 cc(1) コマンドを使用した C のコンパイルの最初のパスとして呼び出されます。 したがって、 cpp の出力は C コンパイラの次のパスへの入力として受け付けられる形式に なるように設計されています。 C 言語が発展するに従って、 cpp とそれ以外の C のコンパイルパッケージはそうした変更に従うように 修正されます。 したがって、C コンパイルの最初のパス以外での cpp の使用はお勧めできません。 cpp を呼び出す望ましい方法は cc(1) コマンドを介して呼び出す方法で、これは、 cpp の機能がどこか他に移動する可能性があるためです。 一般のマクロプリプロセッサについては m4(1) を参照してください。

cpp は 2 つのファイル名を引数として受け付けることができます。 ifile および ofile はそれぞれ、プリプロセッサの入力と出力です。 これらが指示されない場合、デフォルトとして標準入力と標準出力が使われます。

cpp に対する下記のオプションが認識されます。

−P C コンパイラの次のパスによって使用される行制御情報を生成することなしに、 入力の前処理を行います。

−C デフォルトでは、 cpp は C スタイルのコメントを取り除きます。 −C オプションが指定された場合は、すべてのコメント (cpp 指示語行に見られるコメントを除く)が出力に渡されます。

−w cpp の警告メッセージの表示を抑制します。

−Q デフォールトでは、 cpp は、 __FILE__ の展開に、文字リテラルとしてダブルクオート(")を用います。 −Q オプションを指定すると、 文字リテラルとしてシングルクオート(’)を用います。このオプションは pc(1) による PASCAL のために用いられます。

−Uname
name の初期定義を削除します。 ここで、 name は特定のプリプロセッサによってあらかじめ定義された予約済みのシンボルです。 もし、name が指定されない場合には、−U オプションは無視され ます。現在予約されているシンボルには、次のものが含まれています。

MIPSEBビッグエンディアンモード
MIPSELリトルエンディアンモード
__STDC__=1ANSI C
LANGUAGE_CC プログラムをコンパイルする場合
LANGUAGE_PASCALPASCAL プログラムをコンパイルする場合
LANGUAGE_FORTRAN FORTRAN プログラムをコンパイルする場合
LANGUAGE_ASSEMBLY アセンブラプログラムをコンパイルする場合
unixオペレーティングシステム
mipsターゲットハードウェア
host_mipsホストハードウェア
SYSTYPE_∗systype に相当するもの
SYSTYPE_BSDBSD ホストシステムにおいて挿入される
SYSTYPE_SYSVSYSV ホストシステムにおいて挿入される

これらはどれも cpp によって定義されたものではありません。 cpp の代わりに、コンパイラドライバ cc(1)、 as(1)、 pc(1) および f77(1) がこれらのシンボルを定義します。

その他

オペレーティングシステム:
unix、ibm、gcos、 os、tss、dmert

ターゲットハードウェア:
interdata、pdp11、u370、 u3b、u3b5、u3b2、 u3b20d、vax

UNIX システムバリアント:
RES、 RT

lint(1): lint

−Dname

−Dname=def
#define 指示語による場合と同様に name を定義します。 =def が与えられない場合は、 name は 1 と定義されます。 −D オプションは −U オプションより低い優先度をもっています。 すなわち、 −U オプションと −D オプションの両方で同じ名前が使用された場合、 その名前はオプションの順序に関係なく定義されません。

−Idir 名前が / で始まらない #include ファイルをサーチするためのアルゴリズムを変更して、 標準リスト上のディレクトリを探す前に dir を探します。 したがって、名前が "" で囲まれている #include ファイルが ifile 引数のディレクトリ中で最初にサーチされ、次に −I オプションで指定されたディレクトリがサーチされ、 最後に標準リスト上のディレクトリがサーチされます。 名前が < > で囲まれている #include ファイルの場合は、 ifile 引数のディレクトリはサーチされません。

−I このオプションは、 #include ファイルをサーチするためのアルゴリズムを変更して、 標準リストを探さないようにするものです。

−M 標準出力上の 1 行に 1 つ、インクルードファイルのパス名を表示します。 それぞれには ifile のサフィックスが .o に変更され、 : とスペースが続くプレサフィックスがつけられます (たとえば、 hello.o: /usr/include/stdio.h)。

cpp は 2 つの特別な名前を理解します。 __LINE__ という名前は、 cpp によって知られる現在の行番号(10 進の整数)として定義され、 __FILE__ は、 cpp によって知られる現在のファイル名(C の文字列)として定義されます。 これらは、他の定義された名前と同じようにどこでも(マクロの中を含む) 使用できます。

cpp 指示語はすべて、 # で始まる行から開始されます。 指示語には以下のものがあります。

#define name token-string
name を単純に token-string と置き換えます。

#define name( arg, ..., arg ) token-string
name と ( の間に空白を置かないことに注意してください。 後に ( が続く name のその後のインスタンス、コンマで区切られたトークンのリスト、および ) を token-string で置き換えます。 この場合、 token-string 内に arg があると、コンマで区切られたリスト内の対応するトークンで置き換えられます。 引数をもつマクロが展開された場合、その引数は拡張された token-string にそのまま置かれます。 token-string 全体が展開された後で、 cpp は新しく作成された token-string の先頭から名前の走査を再実行し、展開します。

#undef name
name の定義があれば、その定義がこの行以降忘れられるようにします。

#ident "string"
この指示語は互換性のために認識されますが、無視されます。

#include "filename"

#include
現時点に、 filename の内容を挿入します(これは cpp を介して実行されます)。 <filename> 表記が使用された場合、 filename は標準の場所だけで探索されます。 詳細については、前述の −I オプションを参照してください。

#line integer-constant "filename"
cpp が C コンパイラの次のパスのための行制御情報を生成するようにします。 Integer-constant は次の行の行番号であり、 filename はそれが属するファイルです。 "filename" が与えられない場合は、現在のファイル名は変更されません。

#endif
テスト指示語  (#if、 #ifdef または #ifndef) で始まる行のセクションを終了させます。 各テスト指示語は一致する #endif をもっていなければなりません。

#ifdef name
name が以前の #define の対象であり #undef の対象にならなかった場合にだけ、後に続く行が出力に現れます。

#ifndef name
name が以前の #define の対象であり #undef の対象とならなかった場合だけは、後に続く行は出力に現れません。

#if constant-expression
constant-expression が 0 でない値として評価される場合だけ、後に続く行は出力に現れます。 すべてのバイナリの非代入 C 演算子、 ?: 演算子、単項の −、 !  および ~ 演算子は、 constant-expression 内ではすべて正当です。 演算子の優先順位は、C 言語によって定義されたものと同じです。 また、単項のオペレータ defined もあり、これは defined (name) または defined name.  の 2 つの形式で constant-expression 内で使用することができます。 これは、 #if 指示語内の #ifdef および #ifndef と同様の使用を許します。 constant-expression 内は、これらの演算子、整定数、および cpp によって知られる名前だけを使用するべきです。 特に、 sizeof 演算子は使用できません。

2 つのシンボル、 foo と fum のどちらかが定義されるかどうかをテストするには、以下を使用してください。

#if defined(foo) || defined(fum)

#else この指示語と対応するテスト指示語の指定を逆にします。 したがって、この指示語の前の行が無視されていたなら、 次に続く行は出力に現れます。 また、その逆も同様です。

#elif constant-expression
#else と同様、#if の後に引き続くが、他の条件レベルを導入し ません。constant-expression には、#if と同様の制限が適用さ れます。例えば、

#if foo==4
a="foo is four";
#elif foo==2
a="foo is two";
#else
a="foo is not four nor two";
#endif

テスト指示子と #else 指示子は入れ子になりますが、#elif は テスト指示子とそれに対応する #else 又は #endif との間には いくつも記述することができます。

ファイル

/usr/include #include ファイルの標準ディレクトリ

関連事項

cc(1), as(1), pc(1), f77(1), m4(1)

診断

cpp によって生成されるエラーメッセージは、自明であるように作られています。 エラーが発生したところの行番号とファイル名が診断と一緒に表示されます。

注意

マクロ展開の引数リスト中に復帰改行文字があった場合、 以前のバージョンの cpp はその通りに復帰改行文字を出力していました。 現在のバージョンでは、これらの復帰改行文字を空白に置き換えるので、 以前のバージョンで発生していた問題は緩和されました。

NEWS-OSRelease 4.2.1R

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026