[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4 C 方言を扱うオプション

以下のオプションは、コンパイラが受け付ける、C(あるいは、C++ や Objective C のように C から導出された言語)の方言を制御する。

-ansi

ANSI 規格に則った C プログラムをサポートする。

C モードでは、ANSI C 規格の C プログラムを全てサポートする。 C++ モードでは ANSI C++ に合致しない GNU の拡張機能を削除する。

このオプションは、ANSI C 規格(C 言語コードをコンパイルするとき)、 あるいは ANSI C++ 規格(C++ 言語のコードをコンパイルするとき) と互換性のない GCC の機能をオフにする。 オフになる機能は、キーワード asmtypeof、 システムの形式を特定する unixvax 等の 定義済マクロ等がある。 また、好ましくない、滅多に使われることのない ANSI のトリグラフの機能を 有効にする。C コンパイラの場合は、C++ 形式の ‘//’ による コメントやキーワード inline を無効にする。 C++ コンパイラの場合は、‘-foperator-names’ が有効になる。

-ansi’ を指定しても、別の形のキーワード __asm____extension____inline____typeof__ は 使用可能である。 もちろん、こういったキーワードを ANSI C プログラムで使うことは ないだろうが、‘-ansi’ つきで行なわれるコンパイルの際に インクルードされる可能性のあるヘッダファイルで使うと便利である。 別の形の定義済マクロ、__unix____vax__ が、 ‘-ansi’ の有無に関わらず、使用可能である。

-ansi’ オプションを指定しただけでは、非 ANSI プログラムを いわれなく拒絶することはない。拒絶するには、‘-ansi’ に加えて ‘-pedantic’ を指定する必要がある。See section 警告を要求/抑止するオプション.

-ansi’ オプションを指定すると、マクロ __STRICT_ANSI__ が 定義済となる。 ヘッダファイルの中には、このマクロが定義されていると、 ANSI 規格では使用しない関数の宣言やマクロの定義をしないようにする ものもある。これは、そのような関数やマクロの名前を別のものに 使っているかもしれないプログラムとの干渉を避けるためである。

関数 allocaabortexit_exit は ‘-ansi’ が指定されると組み込み関数ではなくなる。

-flang-isoc9x

C9X 規格にある機能のサポートを有効にする。 特に、C9X のキーワード restrict のサポートを 有効にする。

-fstd=

言語規格を指定する。このオプションには値を指定しなければならない。 指定できる値は以下の通り。

このオプションが指定されていない場合でも、以前の C 規格と矛盾しない 限り、より新しい規格の幾つかの機能を使うことが可能である。例えば、 ‘-fstd=c9x’ が指定されていない場合でも __restrict__ を使って良い。

-fno-asm

asminlinetypeof をキーワードとして 認識しない。これらの名前は識別子として使用可能になる。 替わりに、__asm____inline____typeof__ が キーワードとして使える。 ‘-ansi’ を指定すると ‘-fno-asm’ も有効になる。

C++ では、このオプションはキーワード typeof にだけ 影響がある。C++ では、asminline は、規格にある キーワードだからである。 キーワード typeof を認識しないようにするには代わりに ‘-fno-gnu-keywords’ オプションを使っても良い。 その場合は、typeof の他に、headof の様な C++ に 固有の拡張キーワードも認識しないようになる。

-fno-builtin

組み込み関数のうち、名前のプレフィックスが ‘__builtin_’ で 始まっていないものを認識しないようにする。現在、影響を受ける関数は、 abortabsallocacosexitfabsffslabsmemcmpmemcpysinsqrtstrcmpstrcpystrlen である。

GCC は、通常、いくつかの組み込み関数をより効率良く扱うような特別な コードを生成する。例えば、alloca の呼び出しはスタックを 直接調整する一個の命令で置き換えられたり、memcpy の呼びだし がコピーを行なうループにインライン展開されることもある。 生成されるコードは、小さく高速であることが多いが、 関数呼び出しはもはや現れないので、こういう呼びだしにブレークポイントを 設定できなくなったり、別のライブラリをリンクすることでその関数の 動作を変えることができなくなったりする。

-ansi’ オプションを指定すると、allocaffs は 組み込み関数ではなくなる。これらの関数は ANSI 規格では規定されていないから である。

-fhosted

ホスト環境でコンパイルが行なわれていることをアサートする。 これにより、‘-fbuiltin’ も暗黙に指定される。 ホスト環境とは、そこで全標準ライブラリが利用可能であり、 main の戻り値型が int であるような環境である。 例としては、OS のカーネル以外はほとんどなんでも当てはまる。 このオプションは、‘-fno-freestanding’ と等価である。

-ffreestanding

孤立した環境でコンパイルが行なわれていることをアサートする。 孤立した環境とは、標準ライブラリがない可能性があり、プログラムの 起動が必ずしも main から始まらない可能性がある環境である。 最もわかりやすい例は、OS のカーネルである。 このオプションは、‘-fno-hosted’ オプションと等価である。

-trigraphs

ANSI C のトリグラフ機能をサポートする。 トリグラフについては問題が多い機能なので、ユーザは詳細を知る必要は ないと思う。‘-ansi’ を指定すると、‘-trigraphs’ が有効になる。

-traditional

旧来の C のコンパイラの機能をいくつかサポートする。 特に以下の機能がサポートされる。

自分のプログラムで、通常は GNU C の組み込み関数である名前を そのプログラム固有の別の目的で使っている場合は、‘-traditional’ の他に ‘-fno-builtin’ を使う必要があるかもしれない。

ANSI C の機能を使っているヘッダファイルをインクルードする場合は、 ‘-traditional’ を使うことはできない。 いくつかのベンダは、ANSI C ヘッダファイルを入れたシステムを出荷 し始めているので、そういうシステムでは、システムのヘッダを一つでも インクルードしているファイルをコンパイルするときには、‘-traditional’ は使えないのである。

-traditional’ オプションを指定すると ‘-traditional-cpp’ も 有効になる。これについては次で説明する。

-traditional-cpp

旧来の C プリプロセッサの機能のいくつかをサポートする。 特に以下の機能をサポートする。

-fcond-mismatch

3項演算子式で、二番目と三番目の引数の型が違っても許す。 そういう式の値は void である。

-funsigned-char

char 型を、unsigned char のように符号なしとする。

各機種により、char のデフォルトがどうあるべきかが決まっている。 デフォルトでは、unsigned char のようになるか、 signed char のようになるかのどちらかである。

理想的には、移植性の良いプログラムにするなら、オブジェクトの符号の 意味によって、必ず signed charunsigned char の どちらかを使うべきである。だが、たくさんのプログラムが単なる char 型を使って書かれており、それが書かれたマシンに依存して、符号付きか、 符号なしかであるかを想定している。 このオプションと、これの逆のオプションにより、デフォルトが反対になっている マシンでプログラムを動作させることができる。

char 型は常に signed char とも unsigned char とも 異なる型である。たとえ、動作が必ずどちらか一方と同じであっても。

-fsigned-char

char 型を、signed char のように符号つきとする。

これは、‘-fno-unsigned-char’ と同じであり、‘-funsigned-char’ の否定形である。 同様に、‘-fno-signed-char’ は ‘-funsigned-char’ と同じである。

-fsigned-bitfields
-funsigned-bitfields
-fno-signed-bitfields
-fno-unsigned-bitfields

これらのオプションは、ビットフィールドの宣言に signedunsigned も使っていないときに、そのビットフィールドが符号付きとなるか符号なしとなるか を制御する。 デフォルトでは、そのようなビットフィールドは符号付きである。 何故なら、そうすると首尾一貫するからである。 int のような基本整数型は符号付きの型である。

だが、‘-traditional’ を指定すると、ビットーフィールドは何があろうと 全て符号なしになる。

-fwritable-strings

文字列定数を書き込み可能なデータセグメントに格納し、一意化しない。 これは、文字列定数に書き込みが可能であると仮定している古いプログラムとの 互換性を取るためにある。‘-traditional’ オプションを 指定してもこの機能が有効になる。

文字列定数に書き込もうとするのは全くの間違いである。 「定数」は定数であるべきなのだ。

-fallow-single-precision

-traditional’ を指定してコンパイルした場合でも、 単精度の数学演算を倍精度に格上げしない

K&R C では、オペランドのサイズに関わらずに、全ての浮動小数点演算を 倍精度に格上げする。 アーキテクチャによっては、単精度の方が倍精度より速いことがある。 ‘-traditional’ オプションを使わなければならない場合で、 かつ、オペランドが単精度の場合には単精度の演算を使用したければ、 このオプションを指定すれば良い。 このオプションは ANSI または GNU C の規約(デフォルト)でコンパイルする場合には、 動作に影響はない。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

This document was generated using texi2html 1.78.