マニュアルページ c99.1
名前
c99 - 標準 C プログラムをコンパイル
形式
c99 [-c] [-Dname[=tokens]] [-E] [-g] [-Idirectory]
[-Ldirectory] [-Ooptlevel] [-ooutfile] [-s] [-Uname]
機能説明
このリリースの c99 ユーティリティーは、2001 年 9 月 12 日 発
行 『 Standard for Information Technology - Portable Operat-
ing System Interface (POSIX(R))
Shell and Utilities』Issue 6 (Volume 1: A - J) に準拠して い
ます。
c99 ユーティリティーは、標準 C コンパイルシステムへのイン タ
フェー ス で す。このユーティリティーは ISO C 標準に準拠した
ソースコードを受け取ります。このシステムは概念的にはコンパイ
ラ とリンクエディタで構成されます。 operand で参照されたファ
イルについて、コンパイルとリンクを行なって実行可能ファイルを
作成します。
-c オプションが指定されると、書式が
file.c であるすべてのパス名オペランドについて、ファイル
$(basename pathname .c).o
が、コンパイルの正常終了時に作成されます。
リンクエディットを禁止するオプション ( -c または -Eなど) が
ない場合、すべてのオペランドのコンパイルとリンクがエラーを発
生せずに終了すると、作成された実行可能ファイルは -o outfile
オ プ ショ ン が指定されていれば outfile に出力されます。 -o
outfile が指定されていなければファイル a.out に出力 さ れ ま
す。
作成された実行可能ファイルのファイルアクセス権は、
S_IRWXO | S_IRWXG | S_IRWXU
に設定され、そのプロセスの umask で指定されたビットはクリ ア
されます。
オプション
c99 ユーティリティーのオプションは、次の影響を受けます。
o -l library オペランドはオプションの形式になってい ま
すが、オペランドのリストにおけるその位置はライブラリ
の検索順序に影響を与えます。
o -I および -L オプションの指定順序には意味が あ り ま
す。
o 移植性のあるアプリケーションの場合は、各オプションを
別々に指定しなければなりません。グループ化されたオプ
ション (たとえば、 -cO) は、すべてのインプリメンテー
ションで認識される必要はないからです。
以下のオプションがサポートされています。
-c コンパイルのリンクエディットのフェーズを抑 制
し、 作成されたオブジェクトファイルを削除しま
せん。
-D name[=value]
C 言語の #define 指令と同様に、名前 name を定
義 します。 =value が省略されると、値として 1
が使用されます。 -D オプションの優先度は、 -U
オ プ ショ ンよりも低くなっています。つまり、
name が -U と -D の両方のオプションで使用され
た 場合、 name はオプションの順序にかかわらず
未定義となります。 c99 は少なくとも 2048 バイ
トの -D 定義および 256 個の名前をサポートしま
す。
次に示す事前定義された name はすべてのモー ド
で有効です。
__BUILTIN_VA_ARG_INCR+
__PRAGMA_REDEFINE_EXTNAME
__SUNPRO_C=0x590
__SVR4 (SPARC)
__SunOS (Solaris)
__amd64 (x86 で -m64 指定時)
__gnu__linux (linux)
__i386 (x86)
__linux (linux)
__linux__ (linux)
__sparc (SPARC)
__sparcv9 (-m64 指定時)
__sun (Solaris)
__unix
__`uname -s`_`uname -r` (Solaris)
__x86_64 (x86)
linux (x86、linux)
次に示す name は事前定義されていません。
unix
sparc (SPARC)
i386 (x86)
sun
-E C 言語のソースファイルを標準出力にコピー し、
す べてのプリプロセッサ指令を展開します。コン
パイルは行いません。テキストファイル以外の オ
ペランドがあると、エラーが発生します。
-g オブジェクトまたは実行可能ファイルに シ ン ボ
リック情報を生成します。
-I directory 絶対パス名以外の名前を持つヘッダを探すため の
ア ルゴリズムを変更し、通常の場所で検索する前
に directory パス名で指定されたディレクトリを
検 索します。二重引用符 ("") で囲まれた名前を
持つヘッダは、その #include 行を含むファイ ル
の 存在するディレクトリで最初に検索され、次に
-I オプションで指定されたディレクトリで検索さ
れ、 最 後 に通常の場所で検索されます。角括弧
(<>) で囲まれた名前を持つヘッダの場合は、 -I
オ プションで指定したディレクトリで検索され、
次に通常の場所で検索されます。 -I オプショ ン
で 指定したディレクトリは、指定順に検索されま
す。
-L directory -l オブジェクトで指定したライブラリを探すため
の アルゴリズムを変更し、通常の場所で検索する
前に directory パス名で指定したディレクトリで
検 索します。 -L オプションで指定したディレク
トリは、指定順に検索されます。
-O optlevel コードの最適化レベルを指定します。optlevel オ
プション引数が数字の 0 の場合、特別なコードの
最適化はすべて無効になります。最適化レベル に
つ いては、cc(1) のマニュアルページを参照して
ください。
-o outfile 生成する実行可能ファイルのパス名としてデ フォ
ル トの a.out ではなく outfile を使用します。
このオプションは、 -c および -E と併用でき ま
せん。
-s オブジェクトか実行可能ファイル、またはその 両
方 を 生 成 します。生成ファイルからは、 exec
ファミリを使って正しく実行するのに必要のな い
シ ン ボ リッ ク 情報およびその他の情報は削除
(strip) されます。 -g および -s の両方のオ プ
ショ ンが存在する場合は、 -s が -g に優先しま
す。
-U name 名前 name の初期定義をすべて除去します。
-D、 -I、 -U、および -L オプションは複数指定可能です。
オペランド
operand の書式は、パス名または -l library 形式です。パス名形
式 の少なくとも 1 つのオペランドを指定しなければなりません。
以下のオペランドがサポートされています。
file.c コンパイルと、オプションのリンクを行う C 言語
の ソースファイル。オペランドは、 -c オプショ
ンが指定された場合はこの形式でなければなり ま
せん。
file.a 通常は ar(1) ユーティリティーで作成され、リン
ク エディタに直接渡されるオブジェクトファイル
のライブラリ。
file.o c99 -c により作成され、リンクエディタに直接渡
されるオブジェクトファイル。
-l library (-l の l は小文字の L ) 次の名前を持つライ ブ
ラリを検索します。
liblibrary.a
ライブラリは、その名前が遭遇したときに検索 さ
れ るため、 -l オペランドの位置は重要です。こ
のようにして、いくつかの標準ライブラリを指 定
することができます。後述の「注意事項 - 標準ラ
イブラリ」を参照してください。
使用方法
c99 ユーティリティーは通常、コンパイル中にカレントディレクト
リ にファイルを作成するため、 c99 ユーティリティーはファイル
作成が可能なディレクトリで実行する必要があります。
c99 は、 -c が指定されず、複数のソースファイルが与えられた場
合に .o ファイルを作成します。
旧来のインプリメントでは、 -L オプションを -l オペランドと共
にコマンド行上で散在的に指定可能なことがあります。アプリケー
ションがこのような動作を行わないシステム上で整合性のあるコン
パイルを行うためには、移植性のあるアプリケーションではすべて
の -L オプションをあらゆる -l オプションよりも前に指定する必
要があります。
ユーザーが、暗黙的な -l c または明示的な -l m に遭遇す る 前
に、ユーザー作成の標準ライブラリ関数の代替バージョンを指定し
た場合は、これらのバージョンが標準バージョンの代わりに使用さ
れると考えられるかもしれません。しかし、これが真とならない理
由があるため (関数をマクロとして定義、クリーンな名前空間の操
作 な ど )、 -L ディレクトリ内に標準ライブラリと同様の名前の
ファイルを存在させると、予期しない動作をする可能性があるとい
うことを明言しておきます。
環境変数 TMPDIR で設定されたディレクトリは、デフォルトの一時
ディレクトリより優先されます。
出力
STDOUT
.c で終了するファイルのオペランドが複数指定された場合、以 下
の形式の出力が各ファイルごとになされることがあります。
"%s:\n", <file>
これらのメッセージは、出力される場合は、各入力ファイル処理に
先行します。このようなメッセージが標準エラーに出力された場合
( STDERR を参照) は、標準出力には出力されません。
-E オプションが指定されると、標準出力は言語の前処理段階の 結
果を示すテキストファイルとなります。このファイルには、以降の
コンパイル段階のための付加情報が含まれることがあります。
STDERR
診断メッセージでのみ使用します。.c で終了する複数のファイ ル
オペランド (または他の未指定の接尾辞) が与えられると、その各
ファイルについて、
"%s:\n", <file>
が出力され、どの入力ファイルに対する診断および警告メッセージ
かを識別することができます。これらのメッセージは、各入力ファ
イル処理に先行します。このようなメッセージが標準出力に出力さ
れ た 場合 ( STDOUT を参照) は標準エラーには出力されません。
STDOUT.
環境
c99: の実行に影響を与える以下の環 境 変 数 に つ い て は、
environ(5) を 参 照してください。 LANG、 LC_ALL、 LC_TYPE、
LC_MESSAGES、および NLSPATH。
TMPDIR 存在すれば、一時ファイルのデフォルトディレ ク
トリに優先するパス名を指定します。
終了状態
以下の終了値が返されます。
0 コンパイルまたはリンクエディットが成功しました。
>0 エラーが発生しました。
c99 で、オブジェクトファイルが作成されないようなコンパイルエ
ラーに遭遇すると、診断を標準エラーに出力して他のソースコード
オペランドのコンパイルを継続しますが、リンクフェーズは実行せ
ず、 0 以外の終了状態を返します。リンクエディタが成功しない
と、診断メッセージが標準エラーに出力され、 c99 はゼロ以外 の
状態で終了します。移植性のあるアプリケーションの場合は、実行
可能ファイルの存在またはそのモードには依存せず、 c99 の終 了
状態に依存する必要があります。
使用例
使用例を次に示します。
c99 -o foo foo.c foo.c をコンパイルし、実行可能ファイ
ル foo を作成します。
c99 -c foo.c foo.c をコンパイルし、オブジェ ク ト
ファイル foo.o を作成します。
c99 foo.c foo.c をコンパイルし、実行可能ファイ
ル a.out を作成します。
c99 foo.c bar.o foo.c をコンパイルし、それ を bar.o
と リ ンクし、実行可能ファイル a.out
を作成します。更に、 foo.o を作成 し
て終了します。
以下の例で、 -L オプションおよび -l オペランドの使用方法と関
係 を示します。モジュール a.c がライブラリ libQ.a 内の関数 f
を呼び出し、またモジュール b.c がライブラリ libp.a 内の関 数
g を呼び出す場合を考えてみます。両方のライブラリは、 /a/b/c
に常駐していると仮定します。希望する方法でコンパイルとリンク
を行うためのコマンド行は、次のようになります。
c99 -L /a/b/c main.o a.c -l Q b.c -l p
この場合、-l Q オペランドは、最初の
@-l p オペランドのみに先行している必要があります。そ れ は、
libQ.a と libp.a の両方が同じディレクトリに存在しているため
です。
ライブラリ名の衝突が発生する場合は、複数の -L オペランドを使
用 す ることができます。前の例で、ユーザーが /a/a/a で新しい
libp.a を使用するが、 /a/b/c/libQ.a からの f を使用する場 合
は、次のようになります。
c99 -L /a/a/a -L /a/b/c main.o a.c -l Q b.c -l p
この例では、リンカーが指定された順に -L オプションを 探 し、
b.c の参照を解決するときに /a/a/a/libp.a を /a/b/c/libp.a よ
りも先に検出します。ただし、 -l オペランドの順序も重要です。
関連項目
ar(1)、 cc(1B)、 nm(1)、 strip(1)、 umask(1)、 environ(5)
注意事項
標準ライブラリ
c99 ユーティリティーは、標準ライブラリのための以下の -l オペ
ランドを認識します。
-l c このライブラリには、 <math.h> に存在しているもの
としてリストされている関数を除く、すべてのライブ
ラリ関数が含まれています。このオペランドは、この
ライブラリを検索するためには存在しなくてもかまい
ません。
-l m このライブラリは、 <math.h> で参照されるすべての
関 数 が含まれています。インプリメンテーションに
よって、このオペランドがなくてもこのライブラリを
検索するものもあります。
-l l このライブラリには、 lex の C 言語出力で必要とな
る関数のうち、 -l c オペランドを通して使用できな
いがものすべてが含まれています。
-l pthread このオペランドは、<pthread.h> で参照されているす
べ て の 関 数 と <unistd.h> で 参照されている
pthread_atfork() を認識可能にします。pthread の
指定がなくても、このライブラリを検索する実装もあ
ります。
-l rt こ の オ ペ ラ ン ド は <aio.h>、 <mqueue.h>、
<sched.h>、 および <time.h> で参照されているすべ
ての関数を認識可能にします。pthread の指定がなく
ても、このライブラリを検索する実装もあります。
-l y このライブラリには、 yacc の C 言語出力で必要 と
なる関数のうち、 -l c オペランドを通して使用でき
ないものすべてが含まれています。
-c や -E など、リンクエディタの呼び出しを禁止するオプショ ン
が ない場合、 c99 ユーティリティーは、 -l c オペランドに相当
する部分を最終 -l オペランドとしてリンクエディタに渡します。
そのため、これはその他のすべてのオブジェクトファイルおよびラ
イブラリがロードされた後で検索されます。
外部シンボル
C コンパイラおよびリンクエディタは、少なくとも 31 バイトまで
の長さを持つ外部シンボルの有効性をサポートします。
コンパイラおよびリンクエディタは、各ソースまたはオブジェクト
ファ イルごとに少なくとも 511 個の外部シンボル、合計で少なく
とも 4095 個の外部シンボルをサポートします。制限を越えると、
診断メッセージが標準出力に出力されます。