[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下のオプションは、コンパイラが受け付ける、C(あるいは、C++ や Objective C のように C から導出された言語)の方言を制御する。
-ansi
ANSI 規格に則った C プログラムをサポートする。
C モードでは、ANSI C 規格の C プログラムを全てサポートする。 C++ モードでは ANSI C++ に合致しない GNU の拡張機能を削除する。
このオプションは、ANSI C 規格(C 言語コードをコンパイルするとき)、
あるいは ANSI C++ 規格(C++ 言語のコードをコンパイルするとき)
と互換性のない GCC の機能をオフにする。
オフになる機能は、キーワード asm
、typeof
、
システムの形式を特定する unix
や vax
等の
定義済マクロ等がある。
また、好ましくない、滅多に使われることのない 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 規格では使用しない関数の宣言やマクロの定義をしないようにする
ものもある。これは、そのような関数やマクロの名前を別のものに
使っているかもしれないプログラムとの干渉を避けるためである。
関数 alloca
、abort
、exit
、_exit
は
‘-ansi’ が指定されると組み込み関数ではなくなる。
-flang-isoc9x
C9X 規格にある機能のサポートを有効にする。
特に、C9X のキーワード restrict
のサポートを
有効にする。
-fstd=
言語規格を指定する。このオプションには値を指定しなければならない。 指定できる値は以下の通り。
このオプションが指定されていない場合でも、以前の C 規格と矛盾しない
限り、より新しい規格の幾つかの機能を使うことが可能である。例えば、
‘-fstd=c9x’ が指定されていない場合でも
__restrict__
を使って良い。
-fno-asm
asm
、inline
、typeof
をキーワードとして
認識しない。これらの名前は識別子として使用可能になる。
替わりに、__asm__
、__inline__
、__typeof__
が
キーワードとして使える。
‘-ansi’ を指定すると ‘-fno-asm’ も有効になる。
C++ では、このオプションはキーワード typeof
にだけ
影響がある。C++ では、asm
と inline
は、規格にある
キーワードだからである。
キーワード typeof
を認識しないようにするには代わりに
‘-fno-gnu-keywords’ オプションを使っても良い。
その場合は、typeof
の他に、headof
の様な C++ に
固有の拡張キーワードも認識しないようになる。
-fno-builtin
組み込み関数のうち、名前のプレフィックスが ‘__builtin_’ で
始まっていないものを認識しないようにする。現在、影響を受ける関数は、
abort
、abs
、alloca
、cos
、exit
、
fabs
、ffs
、labs
、memcmp
、memcpy
、
sin
、sqrt
、strcmp
、strcpy
、strlen
である。
GCC は、通常、いくつかの組み込み関数をより効率良く扱うような特別な
コードを生成する。例えば、alloca
の呼び出しはスタックを
直接調整する一個の命令で置き換えられたり、memcpy
の呼びだし
がコピーを行なうループにインライン展開されることもある。
生成されるコードは、小さく高速であることが多いが、
関数呼び出しはもはや現れないので、こういう呼びだしにブレークポイントを
設定できなくなったり、別のライブラリをリンクすることでその関数の
動作を変えることができなくなったりする。
‘-ansi’ オプションを指定すると、alloca
と ffs
は
組み込み関数ではなくなる。これらの関数は ANSI 規格では規定されていないから
である。
-fhosted
ホスト環境でコンパイルが行なわれていることをアサートする。
これにより、‘-fbuiltin’ も暗黙に指定される。
ホスト環境とは、そこで全標準ライブラリが利用可能であり、
main
の戻り値型が int
であるような環境である。
例としては、OS のカーネル以外はほとんどなんでも当てはまる。
このオプションは、‘-fno-freestanding’ と等価である。
-ffreestanding
孤立した環境でコンパイルが行なわれていることをアサートする。
孤立した環境とは、標準ライブラリがない可能性があり、プログラムの
起動が必ずしも main
から始まらない可能性がある環境である。
最もわかりやすい例は、OS のカーネルである。
このオプションは、‘-fno-hosted’ オプションと等価である。
-trigraphs
ANSI C のトリグラフ機能をサポートする。 トリグラフについては問題が多い機能なので、ユーザは詳細を知る必要は ないと思う。‘-ansi’ を指定すると、‘-trigraphs’ が有効になる。
-traditional
旧来の C のコンパイラの機能をいくつかサポートする。 特に以下の機能がサポートされる。
extern
宣言が、関数定義の中で書かれているものであっても、
グローバルとして扱われる。
これは、暗黙の関数宣言も含む。
typeof
、inline
、signed
、
const
、volatile
を認識しない。
(これらの代わりとして、__typeof__
、__inline__
等を引き続き
使うことができる。)
unsigned short
と unsigned char
は、
unsigned int
に格上げされる。
register
宣言されていない自動変数は全て longjmp
により
保存される。通常は、GNU C は ANSI C に従う。つまり、volatile
宣言されていない自動変数は、破壊される可能性がある。
自分のプログラムで、通常は GNU C の組み込み関数である名前を そのプログラム固有の別の目的で使っている場合は、‘-traditional’ の他に ‘-fno-builtin’ を使う必要があるかもしれない。
ANSI C の機能を使っているヘッダファイルをインクルードする場合は、 ‘-traditional’ を使うことはできない。 いくつかのベンダは、ANSI C ヘッダファイルを入れたシステムを出荷 し始めているので、そういうシステムでは、システムのヘッダを一つでも インクルードしているファイルをコンパイルするときには、‘-traditional’ は使えないのである。
‘-traditional’ オプションを指定すると ‘-traditional-cpp’ も 有効になる。これについては次で説明する。
-traditional-cpp
旧来の C プリプロセッサの機能のいくつかをサポートする。 特に以下の機能をサポートする。
__STDC__
は、‘-traditional’ を指定すると
定義されないが、__GNUC__
は定義される。
(なぜなら、__GNUC__
が指示する GNU の拡張は、‘-traditional’
によって影響されないからである。)
‘-traditional’ が指定されるかどうかに依存して異なる動作を
するヘッダファイルを書く必要がある場合は、この両方の定義済マクロが
定義されるかどうかを調べることで、次の四つの場合を区別することが
できる。すなわち、GNU C、GNU の旧来の C、他の ANSI C コンパイラ、
他の旧来の C コンパイラである。
定義済マクロ __STDC_VERSION__
もまた、‘-traditional’ を
指定した場合には定義されない。これらを含む定義済マクロの詳細に
ついては See (cpp.info)Standard Predefined section `Standard Predefined Macros' in The C Preprocessor.
-fcond-mismatch
3項演算子式で、二番目と三番目の引数の型が違っても許す。 そういう式の値は void である。
-funsigned-char
char
型を、unsigned char
のように符号なしとする。
各機種により、char
のデフォルトがどうあるべきかが決まっている。
デフォルトでは、unsigned char
のようになるか、
signed char
のようになるかのどちらかである。
理想的には、移植性の良いプログラムにするなら、オブジェクトの符号の
意味によって、必ず signed char
か unsigned 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
これらのオプションは、ビットフィールドの宣言に signed
も unsigned
も使っていないときに、そのビットフィールドが符号付きとなるか符号なしとなるか
を制御する。
デフォルトでは、そのようなビットフィールドは符号付きである。
何故なら、そうすると首尾一貫するからである。
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.