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 Operating 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 ユーティリティのオプションは、次の影響を受けます。

    •   -l library オペランドはオプションの形式になっていますが、オペランドのリストにおけるその位置はライブラリの検索順序に影響を与えます。

    •   -I および -L オプションの指定順序には意味があります。

    •   移植性のあるアプリケーションの場合は、各オプションを別々に指定しなければなりません。グループ化されたオプション (たとえば、 -cO) は、すべてのインプリメンテーションで認識される必要はないからです。

以下のオプションがサポートされています。

-c  コンパイルのリンクエディットのフェーズを抑制し、作成されたオブジェクトファイルを削除しません。

-D name[=value]
    C 言語の #define 指令と同様に、名前 name を定義します。 =value が省略されると、値として 1 が使用されます。 -D オプションの優先度は、 -U オプションよりも低くなっています。つまり、 name が -U と -D の両方のオプションで使用された場合、 name はオプションの順序にかかわらず未定義となります。 c99 は少なくとも 2048 バイトの -D 定義および 256 個の名前 をサポートします。

    次に示す事前定義された name はすべてのモードで有効です。
    __sparc (SPARC)
    __i386 (x86)
    __unix
    __sun
    __BUILTIN_VA_ARG_INCR
    __SUNPRO_C=0x560
    __SVR4

    次に示す name は -Xc モードでは事前定義されていません。
    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 個の外部シンボルをサポートします。 制限を越えると、診断メッセージが標準出力に出力されます。