GCC(1) GNU Tools GCC(1) 名称 gcc, g++ - GNU プロジェクト C コンパイラ および C++ コンパイラ (v2.4) 書式 gcc [option | filename ]... g++ [option | filename ]... 注意 このマニュアルに書かれた情報は GNU C コンパイラの完全なドキュメンテーションからの抜粋であり、オプションの意味の記述 にとどめます。このマニュアルはボランティアのメンテナンスが行われた時にのみ更新されるもので、常に最新の情報を示し て いるわけではありません。 完 全 な 現在のドキュメンテーションが必要な場合は、Info ファイルの`gcc' またはマニュアルの Using and Porting GNU CC (for version 2.0) を参照して下さい。この双方は Texinfo のソースファイル gcc.texinfo から生成されます。 解説 C と C++ のコンパイラは統合されています。どちらの場合も、入力ファイルは、プリプロセス、コンパイル、アセンブル、リン ク の 4 つの処理ステージのうちの 1 つ以上のステージを踏んで処理されます。ソースファイル名の拡張子によってソースの言 語を識別しますが、デフォルトの動作は、どちらの名前でコンパイラを使うかに依存しています: gcc プリプロセス済みの (.i) ファイルを C のファイルと仮定し、C スタイルのリンクを行います。 g++ プリプロセス済みの(.i) ファイルを C++ のファイルと仮定し、C++ スタイルのリンクを行います。 ソースファイル名の拡張子は、その言語が何であるかと、とどのような処理が行われるべきかを示します: .c C言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 .C C++言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 .cc C++言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 .cxx C++言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 .m Objective-C 言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 .i プリプロセッサにかけられたC言語ソースです。コンパイラ、アセンブラにかけられます。 .ii プリプロセッサにかけられたC++言語ソースです。コンパイラ、アセンブラにかけられます。 .s アセンブリ言語ソースです。アセンブラにかけられます。 .S アセンブリ言語ソースです。プリプロセッサ、アセンブラにかけられます。 .h プリプロセッサファイルです。通常はコマンドラインには現れません。 ?? その他の(解釈されない)拡張子を持つファイルはリンカに渡されます。 以下のファイルも同様です。 .o オブジェクトファイルです。 .a アーカイブファイルです。 リンクは、オプション -c, -S, -E を指定して抑制しないかぎり(もしくはコンパイルエラーによってすべての処理が中断しない かぎり)、常に最終ステージで実行されます。リンクのステージにおいては、ソースファイルに対応した全ての .o ファイルと、 -l で指定したライブラリと、理解できなかったファイル名 (名前に .o のついたオブジェクトファイルや .a のついたアーカイ ブを含む) は、コマンドラインに並べられた順番でリンカに渡されます。 オプション オプションは分割されていなければなりません。すなわち `-dr' は `-d -r 'とは異なった扱いを受けます。 ほ とんどの `-f' と `-W' 形式のオプションには、 -fname と -fno-name (または -Wname と -Wno-name) の形式の、対照的な 表現があります。ここではデフォルトでない形式のみを示します。 すべてのオプションをタイプ別に分けてまとめました。詳しい解説は以下のセクションで行います。 全体的なオプション -c -S -E -o file -pipe -v -x language 言語オプション -ansi -fall-virtual -fcond-mismatch -fdollars-in-identifiers -fenum-int-equiv -fno-asm -fno-builtin -fno-strict-prototype -fsigned-bitfields -fsigned-char -fthis-is-variable -funsigned-bitfields -funsigned-char -fwritable-strings -traditional -traditional-cpp -trigraphs 警告オプション -fsyntax-only -pedantic -pedantic-errors -w -W -Wall -Waggregate-return -Wcast-align -Wcast-qual -Wchar-subscript -Wcomment -Wconversion -Wenum-clash -Werror -Wformat -Wid-clash-len -Wimplicit -Winline -Wmissing-prototypes -Wnested-externs -Wno-import -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wshadow -Wstrict-prototypes -Wswitch -Wtemplate-debugging -Wtraditional -Wtrigraphs -Wuninitialized -Wunused -Wwrite-strings デバッグオプション -a -dletters -fpretend-float -g -glevel -gcoff -gxcoff -gxcoff+ -gdwarf -gdwarf+ -gstabs -gstabs+ -ggdb -p -pg -save-temps -print-libgcc-file-name 最適化オプション -fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fdelayed-branch -felide-constructors -fexpensive-optimizations -ffast-math -ffloat-store -fforce-addr -fforce-mem -finline-functions -fkeep-inline-functions -fmemoize-lookups -fno-default-inline -fno-defer-pop -fno-function-cse -fno-inline -fno-peephole -fomit-frame-pointer -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fstrength-reduce -fthread-jumps -funroll-all-loops -funroll-loops -O -O2 プリプロセッサオプション -Aassertion -C -dD -dM -dN -Dmacro[=defn] -E -H -idirafter dir -include file -imacros file -iprefix file -iwithprefix dir -M -MD -MM -MMD -nostdinc -P -Umacro -undef アセンブラオプション -Wa,option リンカオプション -llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker option -Wl,option -u symbol ディレクトリオプション -Bprefix -Idir -I- -Ldir ターゲットオプション -b machine -V version コンフィギュレーション依存オプション M680x0 オプション -m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881 -mbitfield -mc68000 -mc68020 -mfpa -mnobitfield -mrtd -mshort -msoft-float VAX オプション -mg -mgnu -munix SPARC オプション -mepilogue -mfpu -mhard-float -mno-fpu -mno-epilogue -msoft-float -msparclite -mv8 Convex オプション -margcount -mc1 -mc2 -mnoargcount AMD29K オプション -m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmall -mstack-check -muser-registers M88K オプション -m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division -mhandle-large-shift -midentify-revision -mno-check-zero-division -mno-ocs-debug-info -mno-ocs-frame-position -mno-optimize-arg-area -mno-seriazlize-volatile -mno-underscores -mocs-debug-info -mocs-frame-position -moptimize-arg-area -mserialize-volatile -mshort-data-num -msvr3 -msvr4 -mtrap-large-shift -muse-div-instruction -mversion-03.00 -mwarn-passed-structs RS6000 オプション -mfp-in-toc -mno-fop-in-toc RT オプション -mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs -mfull-fp-blocks -mhc-struct-return -min-line-mul -mminimum-fp-blocks -mnohc-struct-return MIPS オプション -mcpu=cpu type -mips2 -mips3 -mint64 -mlong64 -mlonglong128 -mmips-as -mgas -mrnames -mno-rnames -mgpopt -mno-gpopt -mstats -mno-stats -mmemcpy -mno-memcpy -mno-mips-tfile -mmips-tfile -msoft-float -mhard-float -mabicalls -mno-abicalls -mhalf-pic -mno-half-pic -G num -nocpp i386 オプション -m486 -mno-486 -msoft-float -mno-fp-ret-in-387 HPPA オプション -mpa-risc-1-0 -mpa-risc-1-1 -mkernel -mshared-libs -mno-shared-libs -mlong-calls -mdisable-fpregs -mdisable-indexing -mtrailing-colon i960 オプション -mcpu-type -mnumerics -msoft-float -mleaf-procedures -mno-leaf-procedures -mtail-call -mno-tail-call -mcomplex-addr -mno-complex-addr -mcode-align -mno-code-align -mic-compat -mic2.0-compat -mic3.0-compat -masm-compat -mintel-asm -mstrict-align -mno-strict-align -mold-align -mno-old-align DEC Alpha オプション -mfp-regs -mno-fp-regs -mno-soft-float -msoft-float System V オプション -G -Qy -Qn -YP,paths -Ym,dir コード生成オプション -fcall-saved-reg -fcall-used-reg -ffixed-reg -finhibit-size-directive -fnonnull-objects -fno-common -fno-ident -fno-gnu-linker -fpcc-struct-return -fpic -fPIC -freg-struct-returno -fshared-data -fshort-enums -fshort-double -fvolatile -fvolatile-global -fverbose-asm 全体的なオプション -x language このオプションに続く入力ファイルの言語を language であると明示的に指定します (拡張子に基づくデフォルトの選択 よりも優先されます)。このオプションは、次の `-x' オプションが出てくるまでの全ての入力ファイルに対して適用 さ れ ま す。language と し て は、 `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', `assembler-with-cpp' をとることが可能です。 -x none 言語の指定を解除します。このオプションのあとに続くファイルは、それらの拡張子に基づいて (あたかも何の `-x' オ プションも使用されたことがないように) 処理されます。 も し、4 つのステージ (プリプロセス、コンパイル、アセンブル、リンク) のうちの一部のみが必要な場合は、 `-x' オプショ ン (またはファイル名の拡張子) を使用して gcc に対してどのステージから開始するかを伝え, さらに `-c', `-S', `-E' のオ プションのうちのどれかを使用して gcc に対してどこで処理を停止させるかを指定します。ここで、いくつかの組合せ (例えば `-x cpp-output -E') は gcc に対して何の動作も行わないように指定することになることに注意してください。 -c ソースファイルを、コンパイルまたはアセンブルまではしますが、リンクはしません。コンパイラの出力は、それぞれの ソースファイルに対応したオブジェクトファイルとなります。 デ フォ ルトでは、GCC はオブジェクトファイルのファイル名として、ソースファイルの拡張子 `.c', `.i', `.s' 等を `.o' で置き換えたものを使用します。 -o オプションを使用することによって、他の名前を指定することも可能です。 GCC は -c オプションを使用した場合は、理解できない入力ファイル (コンパイルやアセンブルを必要としない ファ イ ル) を無視します。 -S コンパイルが終った所で処理を停止し、アセンブルは行いません。アセンブラでない入力ファイルが指定された場合は、 出力はアセンブラコードのファイルになります。 デフォルトでは、GCC はアセンブラファイルのファイル名として、ソースファイルの拡張子 `.c', `.i' 等を `.s' で置 き 換えたものを使用します。 -o オプションを使用することによって、他の名前を指定することも可能です。 GCC はコ ンパイルを必要としない入力ファイルを全て無視します。 -E プリプロセス処理が終了したところで停止します。コンパイルはしません。出力はプリプロセス済みのソースコードであ り、標準出力へと送られます。 GCC はプリプロセスを必要としない入力ファイルを全て無視します。 -o file 出力先を file に指定します。このオプションは GCC が実行可能ファイル、オブジェクトファイル、アセンブラファイ ル、プリプロセス済み C コードなどの、いかなる種類の出力を行う場合にも適用可能です。 出力ファイルは 1 つしか指定できないため、 `-o' を複数の入力ファイルをコンパイルする際に使用することは、実 行 ファイルを出力する時以外は無意味です。 `-o'オ プ ショ ン を 指 定 し な かっ た 場合のデフォルトは、実行ファイルを作る場合は `a.out' という名前であ り、`source.suffix' の形式のファイル名を持ったソースファイルのオブジェクトファイルは `source.o' であり、アセ ンブラのファイルは `source.s' です。プリプロセス済みの C 言語は、全て標準出力に送られます。 -v (標 準エラー出力に対して) コンパイルの各ステージで実行されるコマンドを表示します。コンパイラドライバ、プリプ ロセッサ、および本来のコンパイラの各バージョン番号も表示します。 -pipe コンパイル時のステージの間のデータの受け渡しに、テンポラリファイルではなくパイプを使用します。いくつかのシス テムではアセンブラがパイプからの入力を受け付けることができないために、このオプションを指定すると失敗します。 GNU アセンブラでは問題なく使用できます。 言語オプション 以下のオプションは、コンパイラが受け付ける C の方言に関する制御を行います: -ansi 全ての ANSI 標準の C プログラムをサポートします。 このオプションは、GNU C が持つ ANSI C との非互換な機能を全て排除します。例えば、asm, inline, typeof などのキ ーワードや、unix や vax などの現在使用しているシステムを規定する定義済みマクロなどが抑制されます。さらに、好 ましくなくかつほとんど使用されない ANSI のトライグラフの機能を使用可能とし、さらに `$' を識別子の一部とし て 使用できないようにします。 代替キーワードである__asm__, __extension__, __inline__, __typeof__ は、 `-ansi' が指定された場合でも使用する ことが可能です。もちろん、これらを ANSI C プログラムで使用することが望ましくないのは当然ですが、`-ansi' をつ け て コンパイルされる場合でも、インクルードされるヘッダファイル中にこれらが記述できるということは有用です。 __unix__ や __vax__ などの代替定義済みマクロは、 `-ansi' を指定する場合でも指定しない場合でも、利用 可 能 と なっています。 `-ansi' オプションは、非 ANSI プログラムを意味もなく拒否することはありません。もしこのような動作を行わせたい 場合には`-ansi'に加えて-pedantic' オプションを指定する必要があります。 プリプロセッサ定義済みマクロ __STRICT_ANSI__ が `-ansi' オプションを使用した際には定義されます。いくつ か の ヘッ ダファイルは、このマクロを識別して、ANSI 標準が望まない関数やマクロの定義を抑制します。これは、それらの 関数やマクロと同じ名前を別の目的で使用するプログラムを混乱させないようにするためです。 -fno-asm asm, inline , typeof をキーワードとして解釈しません。これらの単語は識別子として解釈されるようになります。 こ れ ら の 代 用 と し て __asm__, __inline__, __typeof__ が使用できます。 `-ansi' を指定すると、暗黙のうちに `-fno-asm' を指定したものとみなされます。 -fno-builtin ビルトイン関数のうち、2 つのアンダースコアで始まるもの以外を認識しなくなります。現 在、 こ の 指 定 は_exit, abort, abs, alloca, cos, exit, fabs, labs, memcmp, memcpy, sin, sqrt, strcmp, strcpy, strlen の関数に影響を 及ぼします。 `-ansi' オプションを指定すると、alloca と _exit はビルトイン関数として扱われなくなります。 -fno-strict-prototype `int foo ();' のような、引数を指定しない関数宣言を、C 言語のように引数の数や型について何の仮定もしないという 扱 いにします (C++ のみ)。通常はこのような宣言は、C++ では foo という関数が 1 つも引数をとらないことを意味し ます。 -trigraphs ANSI C のトライグラフを使用可能とします。`-ansi' オプションを指定すると、暗黙のうちに `-trigraphs' を指定 し たものとみなされます。 -traditional 伝統的な C コンパイラのいくつかの特徴をサポートします。詳しくは GNU C のマニュアルを参照してください。以前は ここにそのリストの複製を載せていましたが、それらが完全に時代遅れになった時に我々に文句が来ないように削除して しまいました。 し かし、C++ のプログラムだけについて (C ではありません) 特記しておくことが 1 つあります。 `-traditional' オ プションは C++ に対して 1 つだけ特別な効果を持ちます。それは、 this への代入を許可するというものです。これは `-fthis-is-variable'オプションの指定が及ぼす効果と同一のものです。 -traditional-cpp 伝 統的な C プリプロセッサのいくつかの特徴をサポートします。これは上に挙げた中で特にプリプロセッサに関係した ものを含みますが、 `-traditional' の指定によって引き起こされる以外の効果を及ぼすことはありません。 -fdollars-in-identifiers 識別子中の `$' の使用を許可します (C++ のみ)。 `-fno-dollars-in-identifiers' を使用することによって、明示 的 に `$'の使用を禁止することも可能です。(GNU C++ では、デフォルトで `$' を許可しているシステムと禁止しているシ ステムがあります)。 -fenum-int-equiv int から列挙型への暗黙の変換を許可します (C++ のみ)。通常は GNU C++ は enum から int への変換は許可してい ま すが、逆は許していません。 -fall-virtual 可 能 な 限 り全てのメンバ関数を暗黙のうちに仮想関数として扱います。全てのメンバ関数 (コンストラクタと new , delete メンバ演算子を除きます) は、出現した時点でそのクラスの仮想関数として扱われます。 これは、これらのメンバ関数への全ての呼び出しが仮想関数のための内部テーブルを参照して間接的に決定されるという ことを意味しません。特定の状況においては、コンパイラは与えられた仮想関数への呼び出しを直接決定できます。この ような場合にはその関数呼び出しは常に直接呼び出しとなります。 -fcond-mismatch 条件演算子の第 2, 第 3 引数の型が異なる記述を許します。このような式の型は void となります。 -fthis-is-variable this への代入を許可します (C++ のみ)。ユーザ定義による記憶管理が可能となった現在では、 `this' への代入は時代 遅れのものとなりました。従ってデフォルトでは、クラスのメンバ関数からの this への代入は不当なものとして扱われ ています。しかし、後方互換性のために、 `-fthis-is-variable' を指定することによってこの効果を得ることができま す。 -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 文字列定数を書き込み可能なデータセグメントに配置し、同内容の文字列を 1 つの共有オブジェクトにする処理を行 い ません。これは、文字定数に書き込むことができることを仮定した昔のプログラムとの互換性をとるために提供されてい ます。`-traditional' オプションも同様の効果を含みます。 文字定数に書き込むという考えは非常によくない考えです。"定数" は定数であるべきです。 プリプロセッサオプション これらのオプションは C プリプロセッサを制御します。各 C ソースファイルは、実際にコンパイルする前に、C プリプロ セッ サにかけられます。 `-E' オプションを使用すると、GCC はプリプロセス以外の処理を行いません。以下に示すオプションのうちのいくつかは、`-E' と同時に使用された時のみ意味をもちます。なぜならば、これらのオプションによって、実際のコンパイルには不適当なプリ プ ロセッサ出力が生成されるためです。 -include file file を、通常の入力ファイルが処理される前に処理します。結果的に file に含まれる内容は、一番最初にコンパイル されることになります。コマンドラインに指定されたすべての `-D' や `-U' オプションは、その記述された順番に関わ ら ず常に `-include file' が処理される前に処理されます。全ての `-include' や `-imacros' オプションは、それら が記述された順番通りに処理されます。 -imacros file 通常の入力ファイルを処理する前にfile を入力として処理しますが、その結果の出力を捨てます。 file によって生 成 さ れた出力は捨てられるため、`-imacros file' の処理結果の影響は、file 中に記述されたマクロがメインの入力ファ イル中で使用可能になることだけです。プリプロセッサは、`-imacrosfile' が記述された順番に関わらず、これを処 理 す る 前に、コマンドラインから与えられた全ての `-D' や `-U' オプションを評価します。全ての `-include' および `-imacros' オプションは、それらが記述された順番通りに処理されます。 -idirafter dir ディレクトリ dir を第 2 インクルードパスに加えます。第 2 インクルードパス中のディレクトリは、メインインク ル ードパス (オプション `-I' によって追加されます) 中にヘッダファイルを探した結果発見できなかった場合に検索され ます。 -iprefix prefix prefix を、その後に続く `-iwithprefix' オプション用のプレフィックスとして使用します。 -iwithprefix dir ディレクトリを第 2 インクルードパスに追加します。ディレクトリ名は prefix と dir を連結することによって得られ ます。ここで prefix は、`-iprefix' オプションによって指定されたものです。 -nostdinc ヘッ ダファイルのための標準のシステムディレクトリを検索しません。`-I' オプションによって指定したディレクトリ (またはカレントディレクトリ) のみを検索します。 `-nostdinc' と `-I-'を使用することにより、インクルードファイルの検索パスを明示的に指定したディレクトリのみに 限定することが可能となります。 -nostdinc++ ヘッダファイルの検索に、C++-固有の標準ディレクトリを用いません。ただしそれ以外の標準ディレクトリは検索されま す。 (このオプションは `libg++' の構築に使用されます。) -undef 標準でない定義済みマクロ(アーキテクチャフラグも含めて)を定義しません。 -E C プリプロセッサの処理のみを行います。指定され全ての C のソースファイルに対してプリプロセスを行い、 標 準 出 力、または指定された出力ファイルに対して出力を行います。 -C プリプロセッサに対してコメントの削除を行わないように指示します。 `-E' オプションとともに使用されます。 -P プリプロセッサに対して `#line' コマンドを生成しないように指示します。 `-E' オプションとともに使用されます。 -M プ リプロセッサに対してmake で使用可能な、オブジェクト間の依存関係を記述した出力を生成するように指示します。 それぞれのソースファイルに対して、プリプロセッサはmake のための規則を 1 つ出力します。この出力は、ターゲット としてそのソースファイルから生成されるオブジェクトファイルのファイル名をとり、依存するファイルのリストとして は `#include' によってソースファイルに読み込まれる全てのファイルの名前が並びます。この規則は 1 行、あるい は 長 い場合には`\' と改行を入れて複数行で出力されます。この規則のリストは、プリプロセス済みの C プログラムのか わりに、標準出力へと出力されます。 `-M' は暗黙のうちに `-E' を含みます。 -MM `-M' と似ていますが、`#include file"'によってインクルードされるユーザ定義のヘッダファイルのみを対象にした 出 力ファイルを生成します。`#include ' によってインクルードされるシステムヘッダファイルは省略されます。 -MD `-M' と似ていますが、依存情報は出力ファイル名の最後の `.o' を `.d' に置き換えたファイル名のファイルに対して 出力されます。 `-MD' を指定したファイルのコンパイルもこれに加えて行われ、 `-M' のように通常のコンパイルを 抑 制することはありません。 Mach のユーティリティである`md' は、これらの複数の `.d' ファイルを `make' コマンドによって使用できる単一の依 存記述ファイルへとマージするのに使用することができます。 -MMD `-MD' と似ていますが、ユーザヘッダファイルのみを対象とし、システムヘッダファイルを無視します。 -H 通常の動作に加えて、使用されたヘッダファイルの名前を表示します。 -Aquestion(answer) questionに対するアサーション answer を定義します。これは `#if #question(answer)' のようなプリプロセッサ条件 節によってテストされます。`-A-' は標準のアサーションを禁止します。通常はこれはターゲットマシンに関する情報を 表しています。 -Dmacro マクロ macro に対して文字列 `1' を定義として与えます。 -Dmacro=defn マクロ macro を defn として定義します。コマンドライン上の全ての `-D' オプションは `-U' オプションの処理を 行 う前に処理されます。 -Umacro マ クロ macro の定義を無効にします。`-U' オプションは全ての `-D' オプションの処理が終了した後、`-include' と `-imacros' オプションの処理の前に処理されます。 -dM プリプロセッサに対して、プリプロセス終了時に有効であったマクロの定義のみを出力するように指示します。`-E' オ プションとともに使用します。 -dD プリプロセッサに対して、全てのマクロ定義を適切な順番で出力中にそのまま出力するように指示します。 -dN `-dD' と似ていますが、マクロの引数と内容を削除します。出力には`#define name' のみが含まれます。 アセンブラオプション -Wa,option オ プション option をアセンブラに対するオプションとして渡します。option がコンマを含む場合は、そのコンマで区 切られた複数のオプションとして与えられます。 リンカオプション これらのオプションは、コンパイラがオブジェクトファイル群をリンクして 1 つの実行可能ファイルを出力する際に使用される ものです。これらはコンパイラがリンクステップを行わない場合には意味を持ちません。 object-file-name 特 別 に認識される拡張子で終っていないファイル名は、オブジェクトファイル、またはライブラリであると認識されま す。(オブジェクトファイルとライブラリファイルの違いはその内容に従ってリンカによって区別されます。) GCC が リ ンクステップを行う場合は、これらのファイルはリンカへの入力として使用されます。 -llibrary 名前が library であるライブラリをリンク時に使用します。 リ ンカは、標準のライブラリ用ディレクトリのリスト中から、実際のファイル名が`liblibrary.a' であるファイルを検 索します。リンカはこのファイルを、ファイル名で直接指定した場合と同様に使用します。検索するディレクトリには、 いくつかの標準システムディレクトリと、`-L' によって指定したディレクトリが含まれます。 通常、この方法で発見されるファイルはライブラリファイル、つまり複数のオブジェクトファイルをメンバとして含むア ーカイブファイルです。リンカは、アーカイブファイルの中を検索して、参照されているが定義されていないシンボルを 定義しているメンバを探し出します。しかし、もしリンカがライブラリでなく通常のオブジェクトファイルを発見した場 合は、そのオブジェクトファイルを通常の方法でリンクします。`-l' オプションを使用する場合とファイル名を直接 指 定 する場合の違いは、`-l' の場合が library を `lib' と `.a' で囲み、いくつものディレクトリを検索することだけ です。 -lobjc Objective C のプログラムをリンクする場合は、この特別な -l オプションを指定する必要があります。 -nostartfiles リンク時に、標準のシステムスタートアップファイルを使用しません。標準ライブラリは通常通りに使用されます。 -nostdlib リンク時に、標準のシステムライブラリとスタートアップファイルを使用しません。指定したファイルのみがリンカに渡 されます。 -static ダイナミックリンクをサポートするシステムにおいて、このオプションは共有ライブラリとのリンクを抑制します。それ 以外のシステムではこのオプションは意味を持ちません。 -shared 他のオブジェクトとリンクして実行可能プログラムを形成し得る共有オブジェクトを生成します。ごく少数のシステムで のみ、このオプションはサポートされています。 -symbolic 共有オブジェクトを構築する際に、グローバルなシンボルへの参照をバインドします。全ての解決できなかった参照に対 して警告を与えます (ただしリンクエディタオプション `-Xlinker -z -Xlinker defs' によってこれを無効化した場 合 を除きます)。ごく少数のシステムでのみ、このオプションはサポートされています。 -Xlinker option オプション option をリンカに対して渡します。リンカに渡すシステム固有のオプションが、 GNU CC が理解できないも のである場合に利用できます。 引数を持ったオプションを渡したい場合は、 `-Xlinker' を 2 度使用すれば可能です。1 度目でオプションを 渡 し、2 度目で引数を渡します。例えば `-assert definitions' を渡すには、 `-Xlinker -assert -Xlinker definitions' のよ うに記述すれば可能です。 `-Xlinker "-assert definitions"' のように指定した場合は正常に動作しません。なぜなら これは、文字列全体を 1 つの引数として渡してしまい、リンカの期待する形式と異なってしまうからです。 -Wl,option オ プション option をリンカに渡します。option がコンマを含む場合は、それらのコンマで複数のオプションとして分 割されます。 -u symbol シンボル symbol が未定義であるかのように振舞います。これは強制的にこのシンボルを定義しているライブラリモジュ ー ル を リンクするために使用します。`-u' は異なったシンボルに対して複数回使用することができます。これによっ て、さらに多くのライブラリモジュールを読み込ませることができます。 ディレクトリオプション これらのオプションは、ヘッダファイル、ライブラリ、コンパイラの一部を検索するディレクトリを指定するために使用され ま す。 -Idir ディレクトリ dir を、インクルードファイルの検索するディレクトリのリスト中に追加します。 -I- `-I-' オプション指定前に `-I' オプションによって指定された全てのディレクトリは、 `#include "file"' の形式に よってのみ検索されます。これらのディレクトリは `#include ' によっては検索されません。 ` -I-' オプション指定後に `-I' で指定したディレクトリは、全ての `#include' 命令によって検索されます。(通常は 全ての `-I' で指定されたディレクトリはこの方法で検索されます。) これに加えて`-I-' オプションは、カレントディレクトリ (現在の入力ファイルが存在するディレクトリ) が `#include "file"' に対する最初の検索対象となることを抑制します。`-I-'によるこの効果を上書きする方法はありません。`-I.' を指定することによって、コンパイラが起動されたディレクトリが検索されることを指定することは可能です。これはプ リプロセッサが行うデフォルトの動作とは異なりますが、たいていはこれで十分です。 `-I-' は、ヘッダファイルの検索に標準のシステムディレクトリを使うことを抑制するわけでは あ り ま せ ん。 従っ て、`-I-' と `-nostdinc' は独立です。 -Ldir ディレクトリdir を`-l' による検索が行われるディレクトリのリストに加えます。 -Bprefix このオプションはコンパイラ自身の実行形式、ライブラリ、データファイルの検索場所を指定します。 コ ン パ イ ラドライバはサブプログラム `cpp', `cc1' (または C++ においては `cc1plus'), `as', そして`ld' を 1 つ、あるいはそれ以上起動します。コンパイラドライバは、起動するプログラムのプレフィックスと し て prefix に `machine/version/' をつけたものとつけないものの双方を使用します。 コンパイラドライバは各サブプログラムの起動時に、 `-B' プレフィックスの指定がある場合は、それを最初に利用しま す。もしその名前が見つからなければ、または `-B' が指定されていなければ、ドライバは 2 つの標準プレフィック ス `/usr/lib/gcc/' と `/usr/local/lib/gcc-lib/' を試します。このどちらにも見つからなければ、コンパイラドライバ は、環境変数 `PATH' のディレクトリリストを利用して、そのプログラム名を検索します。 ランタイムサポートファイル `libgcc.a' も、必要ならば `-B' プレフィックスを用いて検索されます。もしそこに見つ か ら なければ、2 つの標準プレフィックスが試みられますが、それで終りです。この場合はリンクの対象から外されま す。ほとんどの場合、またほとんどのマシンでは、 `libgcc.a' は実際には重要ではありません。 これと同じ効果を、環境変数 GCC_EXEC_PREFIX によっても得ることができます。もしこの環境変数が定義され て い れ ば、 この値がプレフィックスとして同様に使用されます。もし `-B' オプションと GCC_EXEC_PREFIX 環境変数の双方が 存在した場合は、 `-B' オプションが最初に使用され、環境変数は次に使用されます。 警告オプション 警告は、本質的に間違いであるわけではありませんが、危険な構造を報告したり、エラーがあるかもしれないような部分を示 唆 する診断メッセージです。 以下のオプションは、GNU CC が生成する警告の量と種類を制御します。 -fsyntax-only コードの文法エラーをチェックしますが、一切出力は行いません。 -w 全ての警告メッセージを抑制します。 -Wno-import #import の利用による警告メッセージを抑制します。 -pedantic 厳 密な ANSI 標準 C 言語で規定している全ての警告を表示し、許されていない拡張を使用したプログラムを全て拒否し ます。 正当な ANSI 標準 C プログラムは、このオプションの有無に関わらずコンパイルできるべきです (もっとも、ほんの わ ず かではありますが `-ansi' を必要とするものはあります)。しかし、このオプションを使用しない場合、 GNU 拡張や 伝統的な C の特徴も、これに加えてサポートされます。このオプションを使用すれば、それらは拒絶されます。この オ プションを使う 理由はありませんが、衒学者たちを満足させるためにのみ存在しています。 `-pedantic' は、`__' で始まる代替キーワードの使用については、警告しません。衒学的な警告は、 __extension__ に 続く表現についても抑制されます。しかし、システムヘッダファイルのみがこの抜け道を使用すべきであり、アプリケー ションプログラムはこれを避けるべきです。 -pedantic-errors `-pedantic' と似ていますが、警告のかわりにエラーを出します。 -W 以下のイベントに対して、特別な警告メッセージを表示します。 o volatile でない自動変数が longjmp への呼び出しによって変更され得る場合です。これらの警告は、最適化コンパイル の時のみ問題になり得ます。 コンパイラは setjmp の呼び出しのみを見ています。コンパイラは、どこでlongjmp が呼び出されるかを知ることはでき ま せん。実際には、シグナルハンドラはコード中の任意の場所で longjmp を呼び出すことができます。従って、実際に はlongjmp への呼び出しが危険な部分からはおこなわれていないために問題のないプログラムであっても、警告が発せら れることになります。 o 関数が、値を伴ってリターンする場合と、値を伴わずにリターンする場合の両方が起こりうる場合です。 (関数の最後を 抜けていくことは、値を伴わずに関数をリターンするとみなされます。) 例えば、次の関数がこの種類の警告を引き起こ します。 foo (a) { if (a > 0) return a; } ある関数 (abort やlongjmp を含む) が決してリターンしないということを GNU CC が理解できないために、にせの警告 が発生するかもしれません。 o 式文 (expression-statement) が一切の副作用を含まない場合です。 o 符号無しの値が 0 と `>' または `<=' で比較される場合です。 -Wimplicit 関数やパラメータに対する暗黙の宣言に対して常に警告します。 -Wreturn-type 関数の戻り値の型が、デフォルトであるint に定義された時に常に警告します。また、戻り値の型が voidでない関数 内 に、戻り値のないreturn 文がある場合にも常に警告します。 -Wunused ローカル変数が宣言されたにも関わらず使用されていない場合、静的に宣言された関数の実体が定義されていない場合、 計算結果が明らかに利用されていない場合に常に警告します。 -Wswitch switch 文がインデックスとして列挙型をとっている時、その列挙型中のいくつかに対する case が欠けている場合に 常 に 警告します。(default ラベルが存在する場合、この警告は出ません。) このオプションを使用した場合には、列挙型 の範囲を越えたcase ラベルも、常に警告されます。 -Wcomment コメントの開始文字列 `/*' がコメント中に現れた時に常に警告します。 -Wtrigraphs トライグラフの出現を常に警告します (トライグラフが使用可能であると仮定します)。 -Wformat printf , scanf などへの呼びだしに対して、与えられた引数が、フォーマット文字列の指定を満足する型を持ってい る かを検査します。 -Wchar-subscripts 配列の添字の型が char であった場合に警告します。これはよくある間違いのもとです。いくつかのマシンにおいてはこ の型が符号付きであることを、プログラマはしばしば忘れてしまいます。 -Wuninitialized 初期化されていない自動変数が使用されています。 これらの警告は、最適化コンパイルを行う時のみ発生します。なぜなら、コンパイラは最適化を行う時にのみデータフロ ー情報を必要とするからです。もし `-O' を指定しなかった場合は、この警告を得ることはできません。 こ れらの警告は、レジスタ割り当ての対象となった変数についてのみ発生します。従って、volatile であると宣言され た変数や、アドレス上に割り当てられた変数、サイズが 1, 2, 4, 8 バイト以外の変数に関してはこれらの警告は発生し ません。さらに、構造体、共用体、配列については、たとえそれらがレジスタに割り当てられたとしても、これらの警告 は発生しません。 ある変数によって計算された値が結局使用されないような変数については、一切の警告が生じないことに注意して 下 さ い。このような計算は、警告が表示される前にデータフロー解析によって削除されます。 これらの警告をオプションにした理由としては、あるコードが間違いを含むかのように見えるが実は正しいかもしれない ということを理解できるほど GNU CC が賢くはないという理由が挙げられます。ここにその 1 つの例を挙げます。 { int x; switch (y) { case 1: x = 1; break; case 2: x = 4; break; case 3: x = 5; } foo (x); } もしy の値が常に 1, 2 あるいは 3 である限りは x は常に初期化されます。しかし GNU CC はこれを知ることはできま せん。もう 1 つの一般的な例を挙げます。 { int save_y; if (change_y) save_y = y, y = new_y; ... if (change_y) y = save_y; } これはバグを含みません。なぜなら save_y は、その値が設定された時のみ使用されるからです。 いくつかのにせの警告は、使用している決してリターンしない関数全てに対して volatile と宣言することによって防ぐ ことが可能です。 -Wparentheses ある特定の文脈中で括弧が省略されていた場合に警告します。 -Wtemplate-debugging C++ プログラムにおいてテンプレートを使用している際に、デバッグが完全に可能でない場合を警告し ま す (C++ の み)。 -Wall 全ての上に挙げた `-W' オプションを結合したものです。これらのオプションは全て、たとえマクロとの組合せであって も、その使い方は避けたほうがいいと我々が推奨するものや、その使い方は簡単に避けることができると我々が信じてい るものです。 残 りの `-W...' オプションは `-Wall' によっては暗黙のうちに指定されません。なぜならこれらは、クリーンなプログラムに おいても、ある状況においては使用することが妥当であると我々が考える構造についての警告を行うオプションだからです。 -Wtraditional 伝統的な C と ANSI C において異なった振舞いをする特定の構造について警告します。 o マクロ引数がマクロ本体内の文字列定数に現れるものです。これは、伝統的な C においてはその引数で置換し ま し た が、ANSI C においては定数の一部として扱われます。 o ブロック内で外部宣言であると宣言され、かつそのブロックの終端の後で使用されている関数です。 o オペランドとして long 型をとる switch 文です。 -Wshadow ローカル変数が他のローカル変数を隠している時に常に警告します。 -Wid-clash-len 2 つの全く別の識別子の最初の len 文字が一致した時に警告します。これは某旧式のおばかさんコンパイラでコンパイ ルされ得るプログラムを作る場合に役に立ちます。 -Wpointer-arith 関数型や void の "サイズ" に依存するものを全て警告します。GNU C はこれらに対して、サイズ 1 を割り当ててい ま す。これは void * ポインタと関数へのポインタにおける計算を簡便にするためです。 -Wcast-qual ポインタが、型修飾子が削除されるようにキャストされる全ての場合に警告します。例えばconst char * を普通の char * にキャストした場合に警告がなされます。 -Wcast-align ポインタのキャストにおいて、そのターゲットに要求されるアラインメントが大きくなるようなキャストを全て警告しま す。例えば char * が int * へとキャストすると、整数が 2、あるいは 4 バイト境界でしかアクセスできないマシンに おいては警告が発せられます。 -Wwrite-strings 文字定数に対して、型 const char[length] を与え、非-const の char * ポインタへのアドレスのコピーに対して警 告 するようにします。この警告は、宣言とプロトタイプにおいてconst の使用を非常に注意深くおこなっていさえすれば、 文字列定数に書き込みをしそうなコードをコンパイル時に発見することを助けますが、そうでない場合は有害無益な指定 です。これが、我々がこの警告を`-Wall' のリクエストに含めなかった理由です。 -Wconversion 同じ引数が与えられた時に、プロトタイプが存在する場合とプロトタイプが存在しない場合とで、異なった型変換を引き 起こす場合について警告します。これは固定小数点から浮動小数点への変換やその逆、デフォルトの動作と異なる固定小 数点引数の幅や符号の有無の変換が含まれます。 -Waggregate-return 構造体や共用体を返す関数を定義した場合や、それらを呼び出す全ての場合に警告します。 (配列を返すことができる言 語においても、これは警告を引き起こします。) -Wstrict-prototypes 引数の型を指定せずに関数を宣言、あるいは定義した場合に警告します。 (以前に引数の型を指定した宣言が存在する場 合には、旧式の関数宣言に対しては警告をしません。) -Wmissing-prototypes グローバルな関数を、その前にプロトタイプ宣言をせずに定義した場合に警告します。この警告は、たとえその定義自身 がプロトタイプを含んでいたとしても発生します。この警告の目的は、ヘッダファイル中にグローバル関数の定義を忘れ ることを防ぐことにあります。 -Wredundant-decls 同 一 スコープ中で複数回、同一対象を宣言した場合に、たとえそれが正当で何も変化させない場合であっても警告しま す。 -Wnested-externs 関数内で extern 宣言を行った場合に警告します。 -Wenum-clash 異なる列挙型の間で変換を行った際に警告します (C++ のみ)。 -Woverloaded-virtual (C++ のみ。) 導出クラスにおいて、仮想関数の定義は基底クラスで定義された仮想関数の型の記述と一致していなけ れ ばなりません。このオプションを使用することによって、基底クラスにおける仮想関数と同一の名前を持ち、基底クラス のいかなる仮想関数とも異なった型の記述を持つ関数に対して警告が行われます。これによって、導出クラスが仮想関数 を定義しようとして失敗する場合を警告することができます。 -Winline 関数がインライン宣言されている、あるいは -finline-functions オプションが与えられている場合に、関数をインライ ン展開できなかった場合に警告します。 -Werror 警告をエラーとして扱います。警告の後にコンパイルを中断します。 デバッグオプション GNU CC は、ユーザのプログラムや GCC の双方をデバッグするために、多くのオプションを備えています。 -g オペレーティングシステムのネイティブのフォーマット (stabs, COFF, XCOFF, DWARF) でデバッグ情報 を 生 成 し ま す。GDB はこのデバッグ情報に基づいて動作することができます。 stabs フォ ー マットを使用するほとんどのシステムにおいては、`-g' を指定すると、GDB だけが使用できる余分なデ バッグ情報が使用可能になります。この特別の情報は GDB に対してはよりよいデバッグを行うことを可能とします が、 おそらく他のデバッガに対してはクラッシュ、あるいはそのプログラムを読めなくしてしまいます。この特別な情報の生 成を制御するためには `-gstabs+', `-gstabs', `-gxcoff+', `-gxcoff', `-gdwarf+', `-gdwarf' を使用してくださ い (下記参照)。 他の多くの C コンパイラと異なり、GNU CC は`-g' を `-O'とともに使用することを許しています。最適化されたコード が通る近道は、時には驚くべき結果を生み出すかもしれません。定義したはずの変数が存在しなかったり、制御の流れが 予想もしなかった場所に移動したり、結果が定数とわかる計算や、結果がすでに手元にある文は実行されなくなり、ある 文がループの外に追い出されて別の場所で実行されたりします。 それにも関わらず、このオプションは最適化された出力のデバッグを可能としています。これはバグを含むかもしれない プログラムに対してオプティマイザを使用することを正当なものとしています。 以下のオプションは、GNU CC を 1 つ以上のデバッグフォーマットを扱えるように作成してある場合に有益です。 -ggdb (も し サポートされていれば)ネイティブのフォーマットでデバッグ情報を生成します。これは可能な限りの全ての GDB 拡張を含みます。 -gstabs (もしサポートされていれば) stabs フォーマットでデバッグ情報を生成します。ただし GDB 拡張は含みません。 こ の フォーマットはほとんどの BSD システム上の DBX で利用できるフォーマットです。 -gstabs+ (も しサポートされていれば) stabs フォーマットでデバッグ情報を生成します。ただし GNU デバッガ (GDB) でしか理 解できない GNU 拡張を使用します。この拡張を使用すると、他のデバッガでは、クラッシュやプログラムが読めなく な るなどの影響がおそらく出ます。 -gcoff (サポートされていれば) COFF フォーマットでデバッグ情報を生成します。これは、System V Release 4 より前の ほと んどの System V 上の SDB で利用できるフォーマットです。 -gxcoff (サポートされていれば) XCOFF フォーマットでデバッグ情報を生成します。これは IBM RS/6000 システムにおいて DBX デバッガによって使用されるフォーマットです。 -gxcoff+ (も し サポートされていれば) XCOFF フォーマットでデバッグ情報の生成を行います。ただし、GNU デバッガ (GDB) に よってのみ理解され得る GNU 拡張を使用します。これらの拡張を使用すると、他のデバッガに対してはクラッシュや プ ログラムを読みとり不能にするなどの影響を及ぼし得ます。 -gdwarf (も し サポートされていれば) DWARF フォーマットでデバッグ情報の生成を行います。これはほとんどの System V Re- lease 4 システムにおいて SDB によって使用される形式です。 -gdwarf+ (もしサポートされていれば) DAWRF フォーマットでデバッグ情報の生成を行います。ただし、GNU デバッガ (GDB) に よっ てのみ理解され得る GNU 拡張を使用します。これらの拡張を使用すると、他のデバッガに対してはクラッシュやプ ログラムを読みとり不能にするなどの影響を及ぼし得ます。 -glevel -ggdblevel -gstabslevel -gcofflevel -gxcofflevel -gdwarflevel デバッグ情報を要求しますが、同時に level によってどの程度の情報が必要かを指定します。デフォルトのレベルは 2 で す。レベル 1 は、デバッグを予定しないプログラムの部分に対してバックトレースを生成するに十分な最低限の情報 を生成します。これは関数と外部変数の記述を含みますが、ローカル変数や行番号に関する情報は含みません。レベル 3 はプログラムに含まれる全てのマクロ定義などの特別な情報を含みます。いくつかのデバッガは `-g3'の使用によってマ クロの展開をサポートします。 -p プログラム prof によって使用されるプロファイル情報を書き込む特別なコードを生成します。 -pg プログラム gprof によって使用されるプロファイル情報を書き込む特別なコードを生成します。 -a 基本ブロックのプロファイル情報を書き込む特別なコードを生成します。これはそれぞれのブロックが何回実行されたか を 記 録 し ます。このデータは tcov のようなプログラムによって解析されます。ただし、このデータフォーマットが tcov が期待するものとは異なっています。最終的には、 GNU gprof が処理できるように拡張されるべきです。 -dletters コンパイル中の letters で指定されるタイミングに、デバッグ用のダンプを生成するように指示します。これはコン パ イ ラをデバッグするために使用されます。ほとんどのダンプのファイル名はソースファイル名に 1 単語をつなげたもの になります。(例えば、`foo.c.rtl' や `foo.c.jump'などです)。 -dM 全てのマクロ定義をダンプし、プリプロセス終了時に出力に書き出します。 -dN 全てのマクロ名をダンプし、プリプロセス終了時に出力に書き出します。 -dD 全てのマクロ定義をプリプロセス終了時に通常の出力に加えてダンプします。 -dy パース中にデバッグ情報を標準エラー出力にダンプします。 -dr RTL 生成後に `file.rtl' に対してダンプします。 -dx 関数をコンパイルするかわりに、RTL を生成するのみの処理を行います。通常は `r'とともに使用されます。 -dj 最初のジャンプ最適化の後に、`file.jump'に対してダンプします。 -ds 共通部分式削除 (しばしば共通部分式削除に続くジャンプ最適化も含みます) の終了時に `file.cse' に対してダンプし ます。 -dL ループ最適化終了時に `file.loop' に対してダンプします。 -dt 第 2 共通部分式削除段階 (しばしば共通部分式削除に続くジャンプ最適化も含みます) の終了時に、`file.cse2' に対 してダンプします。 -df フロー解析終了後に、`file.flow' に対してダンプします。 -dc 命令コンビネーション終了時に `file.combine' に対してダンプします。 -dS 第 1 命令スケジューリング段階終了時に `file.sched' に対してダンプします。 -dl ローカルレジスタ割り当て終了時に `file.lreg' に対してダンプします。 -dg グローバルレジスタ割り当て終了時に `file.greg' に対してダンプします。 -dR 第 2 命令スケジューリング段階終了時に `file.sched2' に対してダンプします。 -dJ 最終ジャンプ最適化終了時に `file.jump2' に対してダンプします。 -dd 遅延分岐スケジューリング終了時に `file.dbr' に対してダンプします。 -dk レジスタからスタックへの転換終了時に `file.stack' に対してダンプします。 -da 以上の全てのダンプを生成します。 -dm 処理の終了時に、メモリ使用に関する統計情報を標準エラー出力に出力します。 -dp どのようなパターンや選択肢が使用されたかを示すコメントをアセンブラ出力中のコメントで解説します。 -fpretend-float クロスコンパイラで処理を行う際に、ホストマシンと同じ浮動小数点フォーマットをターゲットマシンが持つかのように 振舞わせます。これは浮動小数点定数の誤った出力を引き起こすが、実際の命令列はおそらく GNU CC をターゲットマシ ンで起動した場合と同じものとなるでしょう。 -save-temps 通常の "一時" 中間ファイルを消去せずに保存します。これらはカレントディレクトリに置かれ、ソースファイルに基づ い た 名 前が付けられます。従って、 `foo.c' を `-c -save-temps' を使用してコンパイルした場合は、 `foo.cpp' , `foo.s' が、`foo.o' と同様に生成されます。 -print-libgcc-file-name ライブラリファイル`libgcc.a' の完全な絶対名を表示します。このファイルはリンクの際のみに使用され、それ以外 の 働 きはありません。このオプションが指定された場合は、GNU CC はコンパイルやリンクを何も行わず、ただファイル名 を表示するのみです。 最適化オプション これらのオプションは様々な種類の最適化処理を制御します。 -O -O1 最適化を行います。最適化コンパイルは幾分長めの処理時間と、大きな関数に対する非常に多くのメモリを必要と し ま す。 `-O' が指定されなかった場合は、コンパイラの目標はコンパイルのコストを低減することや、目的の結果を得るた めのデバッグを可能とすることに置かれます。それぞれの文は独立しています。つまり、ブレークポイントでプログラム を停止させることによって、任意の変数に新しい値を代入したり、プログラムカウンタを他の文へと変更することを可能 とし、そのソースコードにプログラマが望む正しい結果を得ることを可能にします。 `-O' を指定 し な かっ た 場 合 は、register と 宣言した変数のみがレジスタへと割り当てられます。コンパイルの結果として得られるコードは、PCC を `-O' なしで使用した場合と比較して若干良くないものとなります。 `-O' が指定されると、コンパイラはコードのサ イ ズ と 実 行 時 間 を 減 少 さ せ る こ と を 試みます。 `-O' を指定することによって、 `-fthread-jumps' と `-fdelayed-branch' のフラグが指定されます。いくつかのマシンではさらにその他のフラグが指定されます。 -O2 さらに最適化を行います。ほとんどのサポートされている最適化手段のうち、空間と速度のトレードオフを含まないもの は 全て使用されます。 -O, と比較して、このオプションはコンパイル時間と生成コードの性能の双方を増加させます。 -O2 は、 -funroll-loops, -funroll-all-loops , そして -fomit-frame-pointer 以外の全ての -fflag オプションを有 効化し、さらに強力な最適化を可能にします。 -O0 最適化を行いません。複数の -O オプションを指定した場合は、レベル番号の有無に関わらず、最後に指定したものが有 効になります。 `-fflag' の形式を持ったオプションは、マシン独立のフラグです。ほとんどのフラグは有効形式と無効形式の双方を持っていま す。`-ffoo' の無効形式は `-fno-foo'です。以下のリストでは、デフォルトではないどちらか 1 つの形式のみを示します。こ れに対して `no-' を削除する、あるいは追加することによって双方の形式を生成することが可能です。 -ffloat-store 浮動小数点変数をレジスタに格納しません。このオプションは 68000 のように (68881 の) 浮動小数点レジスタが dou- ble よりも高い精度を持っていると思われるマシンにおいて、望まない超過精度を抑制することを可能にします。ほとん どのプログラムにおいては、超過精度は単に良い結果を生むだけですが、いくつかのプログラムは正確な IEEE の浮動小 数点フォーマット定義に依存しています。このようなプログラムに対して `-ffloat-store' を使用します。 -fmemoize-lookups -fsave-memoized コ ンパイルを高速に行うために、ヒューリスティックな方法を使用する (C++ のみ)。これらのヒューリスティックスは デフォルトでは有効になっていません。なぜなら、これはある種の入力ファイルにしか効果がなく、その他のファイルで はかえってコンパイルが低速になるからです。最初に、コンパイラはメンバ関数への呼びだし (あるいはデータメンバへ の参照) を構築します。これは (1) どのクラスでその名前のメンバ関数が実装されているかを決定し、(2) どのメン バ 関 数への呼び出しであるかという問題 (これはどの種類の型変換が必要となるかという決定も含みます) を解決し、(3) 呼び出し側に対するその関数の可視性を検査するという作業を行う必要があります。これらは全て、コンパイルをより低 速 にしてしまいます。通常は、そのメンバ関数への 2 度目の呼び出しが起こった場合も、この長い処理がまた行われる ことになります。これは次のようなコード cout << "This " << p << " has " << n << " legs.\n"; は、これらの 3 つ の手順を 6 回繰り返すということを意味します。これに対して、ソフトウェアキャッシュを使用すると、そのキャッ シュへの"ヒット "は、コストを劇的に低減することが期待できます。不幸なことに、キャッシュの導入によって異 なっ た レイヤの機構を実装することが必要となり、それ自身のオーバヘッドが生じてしまいます。 `-fmemoize-lookups' は このソフトウェアキャッシュを有効にします。メンバとメンバ関数へのアクセス特権 (可視性) はある関数におけるコン テ ク ス ト と、 別 の 関 数 におけるものとでは異なるために、 g++ はキャッシュをフラッシュしなければなりませ ん。`-fmemoize-lookups' フラグを使用すると、全ての関数をコンパイルするたびに毎回キャッシュをフラッシュ し ま す。`-fsave-memoized' フラグは同一のソフトウェアキャッシュについて、コンパイラが前回コンパイルした関数のコン テクストが、次にコンパイルするのコンテクストと同一のアクセス特権を有しているとみなせる時には、キャッシュを保 持します。これは同一クラス中に多くのメンバ関数を定義している時に特に有効です。他のクラスのフレンドになってい るメンバ関数を除き、同一のクラスに属している全てのメンバ関数のアクセス特権は、全て同一です。このような場合は キャッシュをフラッシュする必要はありません。 -fno-default-inline クラススコープ中に定義されたメンバ関数をデフォルトでインライン関数とする処理を行いません (C++ のみ)。 -fno-defer-pop それぞれの関数呼び出しに対して、関数のリターン直後に常に引数をポップします。関数呼出後に引数をポップしなけれ ばならないマシンにおいては、コンパイラは通常、いくつかの関数の引数をスタックに積んで、それらを同時にポップし ます。 -fforce-mem メ モ リオペランドに対して、それらに対する演算が行われる前に、レジスタにコピーします。これは全てのメモリ参照 を、潜在的な共通部分式であると定めることによって、より良いコードを生成します。もしそれが共通部分式でなかった 場合は、命令コンビネーションによってレジスタへの読み込みは削除されます。私はこれがどのような違いを生み出すか ということに興味があります。 -fforce-addr メモリアドレス定数について、それらに対する演算が行われる前にレジスタにコピーします。これは `-fforce-mem' と 同じ手法でより良いコードを生成します。私はこれがどのような違いを生み出すかということに興味があります。 -fomit-frame-pointer フレームポインタをレジスタに格納する必要のない関数において、この処理を行いません。これはフレームポインタの保 存、設定、復帰にかかる命令を省略し、さらに、多くの関数でレジスタ変数として使用できる余分なレジスタを得ること を 可能にします。ただし、このオプションはほとんどのマシンにおいてデバッグを不可能にします。 Vax などのいくつ かのマシンでは、このフラグは効果を持ちません。なぜならこれらのマシンでは標準の呼びだし手続きが自動的にフレー ム ポ インタの設定を行ってしまい、これが存在しないとしたところで何も節約ができないからです。マシン記述マクロ FRAME_POINTER_REQUIRED が、ターゲットマシンがこのフラグをサポートするかどうかを制御しています。 -finline-functions 全ての単純な関数を呼びだし側に組み込んでしまいます。コンパイラはヒューリスティックに、どの関数がこの方法で組 み込むに足りるほど単純かを決定します。もし、ある関数に対する全ての呼び出しを組み込むことができ、かつその関数 が static と宣言されていた場合は、GCC はその関数を独立したアセンブラコードとしては出力をしません。 -fcaller-saves 関数呼び出しにおいて破壊されるであろう値を、レジスタに保持することを可能とします。これはこのような呼び出しの 周囲にレジスタに対する保存、復帰の特別なコードを出力することによって実現されます。このような割り当ては、それ が通常よりも良いコードを出力するとみなされる場合にのみ行われます。このオプションは特定のマシンではデフォルト で有効となっています。これらは通常、このオプションの処理の代わりに使うことができる呼び出し時保存レジスタが存 在しないマシンです。 -fkeep-inline-functions ある関数への呼び出しが全て呼びだし側に組み込むことができて、かつその関数が static と宣言されていたとしても、 その関数の独立したランタイムバージョンを生成します。 -fno-function-cse 関数のアドレスをレジスタに置きません。つまり、定まった関数を呼び出すコードは、それぞれ明示的な関数のアドレス を含むコードとなります。このオプションは効率の低いコードを生成しますが、アセンブラ出力を書き換えるようなハッ クを行う場合には、このオプションを使用しなければ混乱させられることでしょう。 -fno-peephole マシン固有のピープホール最適化を禁止します。 -ffast-math こ のオプションは生成コードのスピードのために、GCC に対して、いくつかの ANSI または IEEE の規則/規格を侵させ ます。例えば、このオプションは sqrt 関数の引数は非負の数であることを仮定します。このオプションはどの `-O' オ プ ションによっても有効とされません。なぜなら、このオプションは数学関数に関する IEEE または ANSI の規則/規格 の厳密な実装に依存して書かれたプログラムに対して誤った出力を与えるからです。 以下のオプションは特殊な最適化に関する制御を行います。`-O2' オプションは`-funroll-loops' と `-funroll-all-loops' を 除くこれらの全てのオプションを有効にします。 `-O' オプションは通常 `-fthread-jumps' と `-fdelayed-branch' を有効とします。ただし、特殊なマシンではデフォルトの最 適化に対して変更が加えられているかもしれません。 最適化に関する "きめ細かいチューニング" が必要な場合に、以下のフラグを使用することが可能です。 -fstrength-reduce ループのストレングスリダクションと繰り返し変数の除去を行います。 -fthread-jumps 分岐ジャンプによってある場所にジャンプした時に、最初の分岐に包括される比較が存在した時に、最初の分岐のジャン プ先を後者の分岐先に変更します。この変更先は、後者の分岐条件の真偽によって、その分岐のジャンプ先か、あるいは その分岐の直後に定められます。 -funroll-loops ループ展開の最適化を行います。これはループの繰り返し数がコンパイル時、あるいはランタイムに決定できる時におい てのみ、実行されます。 -funroll-all-loops ループ展開の最適化を行います。これは全てのループに対して行われます。このオプションは大抵、より遅く動作するプ ログラムを生成します。 -fcse-follow-jumps 共通部分式削除の処理において、ジャンプ命令の行先が他の経路から到達できない場合は、そのジャンプ命令を考慮して スキャンを行なう。例えば、共通部分式削除処理中に else 節を伴った if 文にであった場合、共通部分式削除は、分 岐条件が偽であった時も継続されます。 -fcse-skip-blocks これは `-fcse-follow-jumps' に似ていますが、ブロックを跨ぐジャンプに対しても共通部分式削除を継続します。共通 部分式削除処理中に、else 節を持たない単純な if 文にであった時、 `-fcse-skip-blocks' は if を跨いだジャンプに 対する共通部分式削除処理を継続します。 -frerun-cse-after-loop ループ最適化が行われた後に、再度共通部分式削除の処理を行います。 -felide-constructors コンストラクタへの呼び出しが省略できるように思われる場合に、その呼び出しを省略する (C++ のみ)。このフラグ を 指定した場合は、GNU C++ は以下のコードに対して、一時オブジェクトを経由せずに y を foo への呼び出しの結果から 直接初期化します。 A foo (); A y = foo (); このオプションを使用しない場合は、GNU C++ は最初に y をA 型の適切 な コンストラクタを呼び出すことによって初期化します。そして、 foo の結果を一時オブジェクトに格納し、最終的に は `y' の値を一時オブジェクトの値に入れ換えます。デフォルトの振舞い (`-fno-elide-constructors') が、ANSI C++ 標 準 のドラフトには規定されています。コンストラクタが副作用を含むプログラムに対して、`-felide-constructors' を指定すると、そのプログラムは異なった動作をする可能性があります。なぜなら、いくつかのコンストラクタの呼び出 しが省略されるからです。 -fexpensive-optimizations 比較的コストの高いいくつかの些細な最適化を行います。 -fdelayed-branch ターゲットマシンにおいてこのフラグがサポートされている場合は、遅延分岐命令後の命令スロットを命令の順番変更に よって利用するように設定します。 -fschedule-insns ターゲットマシンにおいてこのフラグがサポートされている場合は、必要なデータを利用可能になるまで待つことによる 実行の遅滞を防ぐために、命令の順番の変更を行います。これは遅い浮動小数点命令やメモリ読み込み命令の実行におい て、それらの結果を必要とする命令の前に他の命令を詰め込む処理に使用されます。 -fschedule-insns2 `-fschedule-insns' と似ていますが、レジスタ割当て処理の後にもう一度命令スケジューリングの段階を置きます。 こ れ は、比較的レジスタ数が少なく、メモリロード命令が 1 サイクルよりも多くを要するマシンにおいて、特に効果的で す。 ターゲットオプション デフォルトでは、GNU CC コンパイラは、現在使用しているマシンと同じタイプのコードをコンパイルします。しか し、GNU CC は クロスコンパイラとしてもインストールすることが可能です。実際には、異なったターゲットマシンのための様々なコンフィ ギュレーションの GNU CC は、同時にいくつもインストールすることが可能です。そこで、どの GNU CC を使用するかを指定 す るために、`-b' オプションを使用することができます。 こ れに加えて、古い、あるいはより新しいバージョンの GNU CC も同時にいくつもインストールしていくことができます。これ らのうち 1 つ (おそらくもっとも新しいもの) がデフォルトとなります。しかし、ひょっとしたら別のものを使いたくなるかも しれません。 -b machine 引 数 machine は、コンパイルのターゲットマシンを規定します。これは GNU CC をクロスコンパイラとしてインストー ルした時に有用です。 machine に指定する値は、GNU CC をクロスコンパイラとしてコンフィギュレーションした時に与 え たマシンタイプと同じです。例えば、80386 上の System V で実行されるプログラムのために `configure i386v' と いうコンフィギュレーションを行ったクロスコンパイラを起動したい場合は、`-b i386v' と指定します。 `-b' の設 定 を省略した場合は、通常は使用しているマシンと同タイプのマシンのためのコンパイルが行われます。 -V version 引 数 version は、起動される GNU CC のバージョンを規定します。これは複数のバージョンがインストールされている 場合に有用です。例えば、 version が `2.0' ならば、GNU CC バージョン 2.0 を起動することを意味します。 `-V' を 指 定しなかった場合のデフォルトのバージョンは、GNU CC をインストールする時に調整可能です。通常は、もっとも一 般的な使用に勧めることができるバージョンがここに指定されます。 マシン依存オプション それぞれのターゲットマシンのタイプは、それぞれの特別なオプションを持つことが可能です。`-m' で始まるオプション群は、 様 々なハードウェアモデルやコンフィギュレーション--例えば 68010 と 68020、浮動小数点コプロセッサの有無-- などを選択 できます。このオプションを指定することによって、コンパイラはどれか 1 つのモデル、あるいはコンフィギュレーションに対 するコンパイルが可能です。 い くつかのコンフィギュレーションは、通常はそのプラットホーム上の他のコンパイラとのコマンドラインに関するの互換性を とるための特別なオプションを用意しています。 以下は 68000 シリーズのために定義された `-m' オプションです。 -m68000 -mc68000 68000 のためのコードを生成します。これは 68000 ベースのシステムに対してコンフィギュレーションを行ったコン パ イラのデフォルトです。 -m68020 -mc68020 (68000 ではなく) 68020 のためのコードを生成します。これは 68020 ベースのシステムに対してコンフィギュレーショ ンを行ったコンパイラのデフォルトです。 -m68881 浮動小数点演算のために 68881 命令を含んだ出力を行います。これは 68020 ベースのシステムにおいて、コンパイラの コンフィギュレーション時に -nfp を指定されなかった場合のデフォルトです。 -m68030 68030 のためのコードを生成します。これは 68030 ベースのシステムに対してコンフィギュレーションを行ったコンパ イラのデフォルトです。 -m68040 68040 のためのコードを生成します。これは 68040 ベースのシステムに対してコンフィギュレーションを行ったコン パ イラのデフォルトです。 -m68020-40 68040 のためのコードを生成しますが、新しい命令を使用しません。この結果として得られるコードは、68020/68881 や 68030, 68040 のいずれのシステムにおいても、比較的高い性能を持ちます。 -mfpa 浮動小数点演算のために Sun FPA 命令を含んだ出力を行います。 -msoft-float 浮動小数点演算のためにライブラリを呼び出す出力を行います。 警告: この必須のライブラリは GNU CC の一部とし て は 含まれません。通常はそのマシンの一般的な C コンパイラの提供するものを使用しますが、これは通常の方法ではク ロスコンパイルで直接使用することはできません。クロスコンパイルを行ないたい場合は、自分自身で必要なライブラリ 関数を用意する必要があります。 -mshort int 型を short int 型のように 16 ビット幅とみなします。 -mnobitfield ビットフィールド命令を使用しません。`-m68000' は暗黙のうちに `-mnobitfield' を含みます。 -mbitfield ビットフィールド命令を使用します。`-m68020' は暗黙のうちに `-mbitfield' を含みます。これは変更されていないソ ースの場合のデフォルトです。 -mrtd 固定個数の引数をとる関数に対して、異なった関数呼び出し方式を使用します。これは、リターン時に引数をポップする rtd 命令を利用するものです。これは呼びだし側で引数をポップさせる必要がないために、1 命令を省略することが可能 となります。この呼びだし方式は通常の Unix で使用されている方式とは互換性がありません。そのため、Unix コン パ イラでコンパイルされたライブラリを呼び出す必要がある限りは、使用することはできません。さらに、全ての可変引数 をとり得る関数 ( printfを含みます) に対して、関数プロトタイプを用意する必要があります。さもないと、これら の 関数に対して誤ったコードが生成されます。さらに、関数に対して多過ぎる引数をつけて呼び出すコードを書いた場合、 これは深刻な誤ったコードを生成します。(通常は多過ぎる変数は害を及ぼすことなく無視されま す。) rtd 命 令 は 68010 と 68020 によってサポートされるが、 68000 では使用できません。 以下は Vax のために定義された `-m' オプションです。 -munix 特 定 の いくつかのジャンプ命令 (aobleq 等) を出力しません。これらの命令で長いレンジを使用した場合、Vax 用の Unix アセンブラはこれを処理できません。 -mgnu これらのジャンプ命令を出力します。アセンブルには GNU アセンブラの使用を仮定します。 -mg 浮動小数点数について、d-フォーマットではなく、g-フォーマットのためのコードを出力します。 以下は SPARC でサポートされている `-m' スイッチです。 -mfpu -mhard-float 浮動小数点命令を含む出力を行います。これはデフォルトです。 -mno-fpu -msoft-float 浮動小数点の処理のためにライブラリを呼び出す出力を行います。 警告: SPARC 用の GNU 浮動小数点ライブラリは存在 し ません。通常はそのマシンの一般的な C コンパイラの提供するものを使用しますが、これは通常の方法ではクロスコ ンパイルで直接使用することはできません。クロスコンパイルを行ないたい場合は、自分自身で必要なライブラリ関数を 用 意 す る必要があります。 -msoft-float は呼びだし方式を変更します。したがって、 全てのプログラムをこのオプ ションでコンパイルしない限り、このオプションは意味をなしません。 -mno-epilogue -mepilogue -mepilogue を指定することによって (デフォルト)、コンパイラは関数を抜けるためのコードを常に関数の最後に出力し ます。関数の途中で関数を抜けるコードは全て、関数の最後の終了コードへのジャンプとして生成されます。 -mno-epi- logue を設定することによって、コンパイラは関数から抜けるコードをインライン化することを試みます。 -mv8 -msparclite これらの 2 つのオプションは SPARC アーキテクチャのバリエーションを選択するために使用されます。デフォル ト で は、(Fujitsu SPARClite 用にコンフィギュレーションしない限りは) GCC は SPARC アーキテクチャ v7 用のコードを生 成します。 -mv8 は、SPARC v8 用コードを生成します。v7 コードとの違いは、整数の乗算と整数の除算が v7 では存在 し ないが v8 には存在するという点のみです。 -msparclite は、SPARClite 用のコードを生成します。これは v7 には 存在せず SPARClite に存在する、整数乗算、整数除算とスキャン (ffs) 命令を追加します。 これらは Convex のために定義された `-m' オプションです。 -mc1 C1 用の出力を行います。これはコンパイラが C1 用にコンフィギュレーションされた時のデフォルトです。 -mc2 C2 用の出力を行います。これはコンパイラが C2 用にコンフィギュレーションされた時のデフォルトです。 -margcount 引数列に先立ち、引数のワード数を置くコードを生成します。いくつかの可搬性のない Convex や Vax のプログラム は こ のワードを必要とします。(デバッガは不定長引数リストを持つ関数を除いて、このワードを必要としません。これら の情報はシンボルテーブルに書かれます。) -mnoargcount 引数の数を示すワードを省略します。これは変更されていないソースを使用した場合のデフォルトです。 これらは、AMD Am29000 のために定義された `-m' オプションです。 -mdw DW ビットが立っていることを仮定したコードを出力します。これは、ハードウェアによってバイト操作やハーフワー ド 操作がサポートされているということを意味します。これはデフォルトです。 -mnodw DW ビットが立っていないことを仮定したコードを出力します。 -mbw システムがバイト操作やハーフワード操作をサポートしていることを仮定したコードを生成します。これはデフォルトで す。 -mnbw システムがバイト操作やハーフワード操作をサポートしていないことを仮定したコードを生成します。これは暗黙のうち に `-mnodw' を含みます。 -msmall ス モールメモリモデルを使用します。これは全ての関数のアドレスが単一の 256KB のセグメント内に入ることと、関数 の絶対アドレスが 256K 以下にあることを仮定します。このオプションは call 命令を const, consth, calli シーケン スの代わりに使用することを可能にします。 -mlarge call 命令が使用できることを仮定しません。これはデフォルトです。 -m29050 Am29050 用のコードを生成します。 -m29000 Am29000 用のコードを生成します。これはデフォルトです。 -mkernel-registers gr96-gr127 レジスタへの参照の代わりに gr64-gr95 を参照するコードを生成します。このオプションは、ユーザのコー ドから使用できるグローバルレジスタから区別されたグローバルレジスタの集合を利用するカーネルのコードをコンパイ ルする時に使用できます。ただし、このオプションが使用されている時にも `-f' flags フラグは通常のユーザモードで の名前を使用します。 -muser-registers 通常のグローバルレジスタの集合 gr96-gr127 を使用します。これはデフォルトです。 -mstack-check __msp_check への呼び出しをそれぞれのスタック調整の後に挿入します。これはしばしばカーネルのコードにおいて用い られます。 これらは、モトローラ 88K アーキテクチャのために定義された `-m' オプションです。 -m88000 m88100 と m88110 の双方で比較的高性能で動作するコードを生成します。 -m88100 m88100 に最適なコードを生成します。ただし m88110 においても動作します。 -m88110 m88110 に最適なコードを生成します。ただし m88100 においても動作します。 -midentify-revision アセンブラ出力中に、ソースファイル名、コンパイラ名とバージョン、タイムスタンプ、使用されたコンパイルフラグを 記した ident ディレクティブを挿入します。 -mno-underscores シンボル名の最初にアンダースコアキャラクタをつけないアセンブラ出力を生成します。デフォルトでは個々の名前に対 して、アンダースコアをプレフィックスとして使用します。 -mno-check-zero-division -mcheck-zero-division 初 期の 88K のモデルはゼロによる除算の処理に問題を持っていた。特に、それらの多くにおいてトラップが生じなかっ たことは問題であった。これらのオプションを使用することによって、ゼロ除算を発見し、例外を知らせるコードを埋め 込 む こ と を禁止 (あるいは明示的に許可) することができます。全ての 88K 用の GCC のコンフィギュレーションは `-mcheck-zero-division' をデフォルトとして使用しています。 -mocs-debug-info -mno-ocs-debug-info 88Open Object Compatibility Standard "OCS" で定義された (それぞれのスタックフレーム中で使用されるレジスタ に 関する) 付加的なデバッグ情報を取り込みます (または省略します)。これらの付加的な情報は GDB によっては必要とさ れません。DGUX, SVr4, Delta 88 SVr3.2 ではデフォルトでこの情報を含めます。その他の 88K コンフィギュレー ショ ンではデフォルトで省略します。 -mocs-frame-position -mno-ocs-frame-position OCS で規定されているように、レジスタの値に対して、スタックフレーム中の特定の場所に保存されるという動作を強制 します (あるいは 要 求 し ま せ ん)。 DG/UX, Delta88 SVr3.2, BCS の コ ン フィ ギュ レ ー ショ ン で は `-mocs-frame-position' を デ フォ ル ト と し て、 そ れ 以 外 の 88k コ ン フィ ギュ レ ー ショ ン で は `-mno-ocs-frame-position' をデフォルトとして使用しています。 -moptimize-arg-area -mno-optimize-arg-area 関数の引数がどのような方法でスタックフレームに格納されるかを指定します。 `-moptimize-arg-area' はスペース を 節 約しますが、いくつかのデバッガ (GDB は含まれない) をクラッシュさせます。`-mno-optimize-arg-area' はより標 準に従っています。デフォルトでは GCC は引数エリアの最適化を行いません。 -mshort-data-num データ参照時に、それらの処理を r0 からの相対参照で行うことによって小さなコードにすることを可能とします。これ は 値のロードを (その他の場合は 2 命令かかるところを) 1 命令で行うことを可能にします。num をこのオプションと ともに指定することによって、どのデータ参照が影響を受 け る か を 指 定 す る こ と が で き ま す。 例 え ば `-mshort-data-512' を指定すると、512 バイト以内のディスプレースメントのデータ参照が影響を受けることになりま す。 `-mshort-data-num' は num が 64K よりも大きな時は効果を持ちません。 -mserialize-volatile -mno-serialize-volatile Volatile なメモリへの参照について、シーケンシャルな整合性を持ったコードを生成する、あるいは生成し ま せ ん。 GNU CC はデフォルトではどのプロセッササブモデルを選んだ場合においても、整合性を常に保証します。これがどのよ うに実現されているかは、サブモデルに依存しています。 m88100 プロセッサはメモリ参照の順番を入れ換えないので、 常にシーケンシャルな整合性は保たれる。もし `-m88100' を使用した場合は、GNU CC はシーケンシャルな整合性を保つ ための特別な命令を生成しません。 m88110 プロセッサにおけるメモリ参照の順番は、必ずしもそれらの要求を行なった 命令の順番とは一致しません。特に、読み込み命令は、先行する書き込み命令よりも先に実行され得る。このような順番 の入れ換えは、volatile なメモリの参照におけるシーケンシャルな整合性を崩してしまい ま す。`-m88000' ま た は `-m88110' を指定した場合には、GNU CC は、必要な場合は特別な命令を生成し、命令の実行が正しい順番で行われるこ とを強制します。ここで生成される整合性を保証するための特別な命令はアプリケーションの性能に対して影響を及ぼし ます。もしこの保証無しで問題がないということがわかっている場合は、`-mno-serialize-volatile' を使用することが できます。 `-m88100' オプションを使用していますが、m88110 における実行時にシーケンシャルな整合性が必要とされ る場合は、`-mserialize-volatile' を使用するべきです。 -msvr4 -msvr3 System V release 4 (SVr4) に関連したコンパイラの拡張を有効 (`-msvr4') あるいは無効 (`-msvr3') にします。これ は以下の内容を制御します。 o 生成するアセンブラの文法の種類 (これは `-mversion-03.00' を使用することによって独立に制御できます)。 o `-msvr4' は C プリプロセッサに対して `#pragma weak' を理解させます。 o `-msvr4' は、GCC に SVr4 によって使用されている付加的な宣言ディレクティブを生成させます。 `-msvr3' は、SVr4 を除く全ての m88K コンフィギュレーションにおけるデフォルトです。 -mtrap-large-shift -mhandle-large-shift 31 ビットより大きいビットシフトを検出するコードを埋め込む。これらのオプションを指定することによって、それ ぞ れ トラップ、あるいは適切に処理するコードが埋め込まれる。デフォルトでは GCC は大きなビットシフトには特別な対 策を行いません。 -muse-div-instruction 非常に初期の 88K アーキテクチャのモデルは除算命令を持っていません。従って、GCC はデフォルトでは除算命令を 生 成しません。このオプションは除算命令が安全に使用できるということを指定します。 -mversion-03.00 DG/UX コ ンフィギュレーションには、2 つの SVr4 の種類があります。このオプションは -msvr4 オプションによって hybrid-COFF または real-ELF が使用されるかどうかを選択します。他のコンフィギュレーションはこのオプションを無 視します。 -mwarn-passed-structs 関 数に対して構造体を渡した場合と、関数が構造体を返した場合に警告します。構造体を渡す手法は C 言語の発展の中 で変化しており、移植性の問題をしばしば生じることになります。デフォルトでは GCC はこの警告を行いません。 これらのオプションは IBM RS6000 のために定義されたものです。 -mfp-in-toc -mno-fp-in-toc 浮動小数点定数を Table of Contents (TOC) に入れるかどうかを指定します。このテーブルは全てのグローバル変数 と 関数のアドレスを格納します。デフォルトでは GCC は浮動小数点定数をここに格納します。もし TOC がオーバーフロー する場合は、`-mno-fp-in-toc' を使用することによって TOC のサイズを小さくすることが可能であり、オーバーフロー を防ぐことができるでしょう。 これらは IBM RT PC 用に定義された `-m' オプションです。 -min-line-mul 整数の乗算に対してインラインのコード列を生成します。これはデフォルトである。 -mcall-lib-mul 整数の乗算に対して lmul$$ を呼び出します。 -mfull-fp-blocks フ ルサイズの浮動小数点データブロックを生成します。これは IBM によって推奨されている最低限のスクラッチスペー スの量を包含します。これはデフォルトです。 -mminimum-fp-blocks 浮動小数点データブロック内に特別なスクラッチスペースを含めません。これによって、より小さなコードが生成される が、実行は遅くなる。なぜならスクラッチスペースが動的に確保されるからです。 -mfp-arg-in-fpregs IBM の関数呼び出し方式とは互換性のない呼び出し方式を使用します。この方式は浮動小数点引数を浮動小数点レジスタ に入れて渡します。このオプションを指定すると、varargs.h や stdarg.h で浮動小数点オペランドが使用できなくなる ことに注意して下さい。 -mfp-arg-in-gregs 浮動小数点に対して通常の関数呼び出し方式を使用します。これはデフォルトです。 -mhc-struct-return 1 ワードより大きな構造体を返す時に、レジスタではなくメモリを使用して返す。これは MetaWare HighC (hc) コンパ イラとの互換性を提供します。`-fpcc-struct-return' を使用することによって Portable C Compiler (pcc) との互 換 性を得ることができます。 -mnohc-struct-return 1 ワードより大きな構造体を返す時に、レジスタによって返される場合があります。これはその方が便利であると考えら れる時に使用されます。これはデフォルトです。IBM が提供 す る コ ン パ イ ラ と の 互 換 性 を 得 る た め に は、`-fpcc-struct-return' と `-mhc-struct-return' の双方を使用します。 これらは MIPS ファミリのために定義された `-m' オプションです。 -mcpu=cpu-type 命令スケジューリング時に、デフォルトのマシンタイプを cpu-type に仮定します。デフォルトの cpu-type は default です。この選択はすべてのマシンに対する最長のサイクル数を元にコードを生成します。これは、生成されるコードがど の MIPS cpu においても適当な速度で処理されるようにするためです。これ以外の cpu-type の選択としては、 r2000, r3000, r4000, r6000 があります。特定の cpu-type を選択した場合は、その特定のチップに適したスケジュールが行わ れ ます。コンパイラは、 -mips2 または -mips3 スイッチが使用されていない場合は、MIPS ISA (instruction set ar- chitecture) のレベル 1 に合致しないコードを生成することはありません。 -mips2 MIPS ISA のレベル 2 (branch likely 命令, 平方根命令) による命令群を出力します。 -mcpu=r4000 と -mcpu=r6000 スイッチは、 -mips2 と共に使用される必要があります。 -mips3 MIPS ISA のレベル 3 (64 ビット命令) を含む命令群を出力します。 -mcpu=r4000 スイッチは、 -mips2 と同時に使用 する必要があります。 -mint64 -mlong64 -mlonglong128 これらのオプションは現在動作しません。 -mmips-as MIPS アセンブラのためのコードを生成し、 mips-tfile を起動して通常のデバッグ情報を追加します。これは OSF/1 標 準 プラットフォーム以外の全てのプラットフォームにおけるデフォルトです。OSF/1 標準プラットフォームは OSF/rose オブジェクトフォーマットを使用します。スイッチ -ggdb, -gstabs, -gstabs+ のうちのどれかが使用されている 場 合 は、 mips-tfile プログラムは、stabs を MIPS ECOFF 中にカプセル化します。 -mgas GNU アセンブラ用のコードを生成します。これは OSF/1 標準プラットフォームにおけるデフォルトです。OSF/1 標準プ ラットフォームは OSF/rose オブジェクトフォーマットを使用します。 -mrnames -mno-rnames -mrnames スイッチは出力コードにおいて、レジスタの名前として、ハードウェア名の代わりに MIPS ソフトウェア名 を 使 用することを指定します。(つまり、 a0 を $4 の代わりに使用します)。 GNU アセンブラは -mrnames スイッチをサ ポートしません。MIPS アセンブラはソースファイルに対して MIPS C プリプ ロ セッ サ を 起 動 す る で しょ う。 -mno-rnames スイッチがデフォルトです。 -mgpopt -mno-gpopt -mgpopt スイッチは、全てのデータ宣言をテキストセクション中の全命令の前に書き出すことを指定します。これによっ て、全ての MIPS アセンブラは、ショートグローバル、あるいは静的なデータアイテムに対して、2 ワードではな く、1 ワードのメモリ参照命令を生成します。これは最適化が指定された場合のデフォルトです。 -mstats -mno-stats -mstats が指定された場合は、コンパイラによってインラインでない関数が処理されるごとに、標準エラー出力ファイル に対して、そのプログラムに対する統計情報を示す 1 行のメッセージを出力します。このメッセージは、保存したレ ジ スタの数、スタックのサイズなどを示します。 -mmemcpy -mno-memcpy -mmemcpy ス イッ チは、全てのブロック転送に対して、インラインコードを生成する代わりに、適切なストリング関数 (memcpy または bcopy) を呼び出すコードを生成します。 -mmips-tfile -mno-mips-tfile -mno-mips-tfile スイッチを指定すると、コンパイラはオブジェクトファイルの mips-tfile を使用した後処理を行いま せ ん。MIPS アセンブラはデバッグサポートを行うためにこれを生成します。 mips-tfile が実行されないと、デバッガ からはローカル変数を扱うことができません。さらに、 stage2 と stage3 のオブジェクトはアセンブラに渡される一時 的なファイル名をオブジェクトファイル中に埋め込まれて持っており、このためそれらを比較した場合に同一のものとは みなされません。 -msoft-float 浮動小数点演算のためにライブラリを呼び出す出力を行います。 警告: この必須のライブラリは GNU CC の一部とし て は 含まれません。通常はそのマシンの一般的な C コンパイラの提供するものを使用しますが、これは通常の方法ではク ロスコンパイルで直接使用することはできません。クロスコンパイルを行ないたい場合は、自分自身で必要なライブラリ 関数を用意する必要があります。 -mhard-float 浮動小数点命令を含んだ出力を生成します。これは変更されないソースを使用した場合のデフォルトです。 -mfp64 ステータスワード中の FR ビットが立っていることを仮定します。これは 32 個の 32 ビット浮動小数点レジスタの代わ りに、32 個の 64 ビットの浮動小数点レジスタが存在するということを示します。この場合は、同時に -mcpu=r4000 と -mips3 スイッチを指定する必要があります。 -mfp32 32 個の 32 ビット浮動小数点レジスタが存在するということを仮定します。これはデフォルトです。 -mabicalls -mno-abicalls いくつかの System V.4 の移植が位置独立コードのために使用する疑似命令 .abicalls, .cpload, .cprestore を出力す る、あるいは出力しません。 -mhalf-pic -mno-half-pic -mhalf-pic スイッチは、テキストセクション中に参照を配置する代わりに、外部参照を行なうポインタをデー タ セ ク ションに配置し、それをロードする動作を指定します。このオプションは現在まだ動作しません。 -Gnum は num バイト 以下のグローバル、あるいは静的なアイテムを、通常のデータや bss セクションではなく、小さなデータ、または bss セ クションに配置することを指定します。これはアセンブラに対して、グローバルポインタ (gp または $28) を基準と した参照を行う場合に、通常では 2 ワード必要なところを 1 ワードのメモリ参照命令を生成することを可能にします。 デフォルトでは MIPS アセンブラが使用される場合、 num は 8 です。また、GNU アセンブラが使用される場合のデフォ ルトは 0 である。 -Gnum スイッチはアセンブラ、リンカにも同様に渡されます。全てのモジュールは同一の -Gnum の 値でコンパイルされなければなりません。 -nocpp MIPS アセンブラに、ユーザアセンブラファイル (`.s' 拡張子を持ちます) に対するアセンブル時のプリプロセッサの起 動を抑制させます。 これらは、Intel 80386 ファミリ用に定義された `-m' オプションです。 -m486 -mno-486 386 ではなく 486 に最適化されたコードを出力する、あるいはその逆を行う指定を行います。486 用に生成されたコ ー ドは 386 で実行可能であり、逆もまた可能です。 -msoft-float 浮 動小数点演算のためにライブラリを呼び出す出力を行います。 警告: この必須のライブラリは GNU CC の一部として は含まれません。通常はそのマシンの一般的な C コンパイラの提供するものを使用しますが、これは通常の方法では ク ロスコンパイルで直接使用することはできません。クロスコンパイルを行ないたい場合は、自分自身で必要なライブラリ 関数を用意する必要があります。関数が浮動小数点数を返す時に 80387 レジスタスタックを使用するマシンに お い て は、`-msoft-float' を使用した場合でも、いくつかの浮動小数点命令が生成されます。 -mno-fp-ret-in-387 関数からの返り値に FPU のレジスタを使用しません。通常の関数呼びだし方式は、たとえ FPU が存在しなくても float と double の結果を FPU レジスタに入れて返してくる。したがってこの場合、オペレーティングシステムは FPU を エ ミュ レートしなければなりません。 `-mno-fp-ret-in-387' オプションを指定すると、浮動小数点数も通常の CPU レジ スタに入れて返されます。 これらは HPPA ファミリ用に定義された `-m' オプションです。 -mpa-risc-1-0 PA 1.0 プロセッサ用のコードを出力します。 -mpa-risc-1-1 PA 1.1 プロセッサ用のコードを出力します。 -mkernel カーネルに適したコードを生成します。特に、引数の 1 つとして DP レジスタをとる add 命令の使用を抑制し、その代 わりに、addil 命令を生成します。これは HP-UX リンカの深刻なバグを避けるための措置です。 -mshared-libs HP-UX 共有ライブラリとリンクさせるコードを生成します。このオプションはまだ完全に動作しているわけではなく、ど の PA ターゲットにおいてもデフォルトになっていません。このオプションを指定すると、コンパイラは誤ったコードを 出力し得ます。 -mno-shared-libs 共 有 ライブラリとリンクしないコードを生成します。これは全ての PA ターゲットにおいてデフォルトのオプションで す。 -mlong-calls 関数の呼び出し先と呼び出し元が同一ファイルに含まれた場合、呼び出し時の距離が 256K 以上の場合でも動作するよう なコードを出力します。このオプションは、リンカから "branch out of range errors" でリンクを拒否された時以外に は使用しないようにしてください。 -mdisable-fpregs いかなる形においても、浮動小数点レジスタの使用を禁止します。これは浮動小数点レジスタに配慮しないコンテクスト スイッチを行うカーネルに対して有効です。このオプションを使用して、浮動小数点処理を行おうとすると、コンパイラ はアボートします。 -mdisable-indexing コンパイラに対して、indexing addressing mode を使用しないように指定します。これによって MACH において MIG に よって生成されたコードをコンパイルする際の、どちらかといえばあいまいないくつかの問題を防ぐことができます。 -mtrailing-colon ラベル定義の後にコロンを加えます (ELF アセンブラ用)。 これらは、Intel 80960 ファミリ用に定義された `-m' オプションです。 -mcpu-type デフォルトのマシンタイプを cpu-type に仮定します。これは生成する命令とアドレッシングモード、そしてアラインメ ントに関係します。デフォルトの cpu-type は kb です。その他の選択としては ka, mc, ca, cf, sa, sb があります。 -mnumerics -msoft-float -mnumerics オプションはプロセッサが浮動小数点命令をサポートすることを示します。 -msoft-float オプションは浮 動小数点サポートを仮定しないことを示します。 -mleaf-procedures -mno-leaf-procedures 葉に位置する手続きについて、 call 命令と同様に bal 命令でも呼び出すことを可能とします (あるいは、しません)。 こ れは bal 命令がアセンブラ、またはリンカによって置き換えられ得る場合には、直接呼び出しに対して効率の良いコ ードを得ることができます。ただし、それ以外の場合は効率の良くないコードを生成します。例えば、関数へのポインタ 経由の呼び出しや、この最適化をサポートしないリンカを使用しなかった場合などがこれに該当します。 -mtail-call -mno-tail-call (マ シン非依存の部分を越えて) 末尾再帰を分岐に変換する処理に関するさらなる最適化を行います。この手法の適用が 正当でないということに関する判断が完全ではないので、まだこのオプションを使用することは適当でないかもしれませ ん。デフォルトは -mno-tail-call です。 -mcomplex-addr -mno-complex-addr こ の i960 の実装では複雑なアドレッシングモードの使用が優位であると仮定します (あるいは仮定しません)。複雑な アドレッシングモードは K-シリーズでは使用する価値はありませんが、C-シリーズでは確かに使用する価値が あ り ま す。現在は -mcomplex-addr が、CB と CC を除く全てのプロセッサにおけるデフォルトです。 -mcode-align -mno-code-align よ り高速なフェッチのためにコードを 8 バイトにアラインします (または何もしません)。現在では C シリーズの実装 においてのみデフォルトで有効にしています。 -mic-compat -mic2.0-compat -mic3.0-compat iC960 v2.0 または v3.0 との互換性を持たせます。 -masm-compat -mintel-asm iC960 アセンブラとの互換性を持たせます。 -mstrict-align -mno-strict-align アラインされないアクセスを許可しません (あるいは許可します)。 -mold-align Intel による gcc リリースバージョン 1.3 (gcc 1.37 ベース) との構造体のアラインメントに関する互換性を持たせま す。現在は、 #pragma align 1 が同時に仮定されてしまい、無効化できないというバグを持っています。 これらは、DEC Alpha 用に定義された `-m' オプションです。 -mno-soft-float -msoft-float 浮動小数点操作に対して、ハードウェアによる浮動小数点命令を使用します (しません)。もし、-msoft-float が指定さ れた場合は、`libgcc1.c' 内の関数が浮動小数点演算に使用されます。ただし、これらのルーチンが浮動小数点演算をエ ミュレートするルーチンによって置き換えられているか、そのようなエミュレーションルーチンを呼び出すようにコンパ イルされているのでない限り、これらのルーチンは浮動小数点演算を行ってしまいます。浮動小数点演算のな い Alpha の た めのコンパイルを行うためには、ライブラリもこれらを呼び出さないようにコンパイルされていなければなりませ ん。浮動小数点演算のない Alpha の実装は、浮動小数点レジスタを必要とするということに注意して下さい。 -mfp-reg -mno-fp-regs 浮動小数点レジスタセットを使用する (使用しない)コードを生成します。 -mno-fp-regs は暗黙のうちに -msoft-float を含みます。浮動小数点レジスタセットが使用されない場合は、浮動小数点オペランドは整数レジスタに入れられて渡さ れ、浮動小数点の結果は $f0 ではなく $0 に入れて返されます。これは非標準の関数呼び出し形式であり、浮動小数 点 の 引数や返り値を持つ関数で、-mno-fp-regs をつけてコンパイルされたコードから呼び出される関数はすべてこのオプ ションをつけてコンパイルされている必要があります。このオプションの典型的な用法は、浮動小数点レジスタを使用せ ず、したがって浮動小数点レジスタへのセーブもリストアも必要のないカーネルを構築する時などがあるでしょう。 こ こに追加するオプションは System V Release 4 において、これらのシステム上の他のコンパイラとの互換性のために提供さ れるものです。 -G SVr4 システムにおいて、gcc は `-G' オプションを受け付けます (そしてこれをシステムリンカに渡します)。これは他 の コ ン パ イ ラとの互換性のためです。しかし、リンカオプションを gcc のコマンドラインから渡すよりも、我々は `-symbolic' または `-shared' の使用が適当であると考えています。 -Qy コンパイラが使用したそれぞれのツールのバージョンを .ident アセンブラディレクティブを使用して、出力で明示しま す。 -Qn .ident ディレクティブを出力に加えることを抑制します (これはデフォルトです)。 -YP,dirs `-l' で 指定されたライブラリに対して、 dirsで規定されたディレクトリのみを検索し、他は検索しません。 dirs 中 は、1 つのコロンで区切ることにより、複数のディレクトリエントリを記述します。 -Ym,dir M4 プリプロセッサを dir に検索します。アセンブラがこのオプションを使用します。 コード生成オプション これらのマシン独立オプションは、コード生成を指定するインターフェースです。 これらのほとんどは `-f'で始まります。これらのオプションは有効形式と無効形式の 2 つの形式を持っています。`-ffoo' の 無効形式は `-fno-foo' です。以下に挙げる表においては、このうち、デフォルトではない片方のみが挙げられています。`no-' を追加するか、削除するかによって双方の形式を得ることができます。 -fnonnull-objects 参照型によって参照されるオブジェクトはヌルでないと仮定します (C++ のみ)。通常は GNU C++ は参照型によって参照 さ れるオブジェクトに関しては保守的な仮定を行います。例えば、コンパイラは a が以下のコードにおいてヌルでない ことをチェックする必要があります。 obj &a = g (); a.f (2); この種の参照がヌルでないことのチェックは、特別 な コードを必要とします。しかし、これは多くのプログラムにとって無用なものです。そこで、`-fnonnull-objects' を使 用することによって、このヌルに対するチェックを必要のない場合に省略することができます。 -fpcc-struct-return struct と union の値を返す場合に、普通の C コンパイラが行うのと同じ方式を使用します。これは小規模な構造体 に 対して非効率なものとなり、また多くのマシンでその関数を再入不可能としてしまいます。しかしこれは、GCC でコンパ イルされたコードと PCC でコンパイルされたコードを相互に呼び出すことを可能とするという利点を持ちます。 -freg-struct-return struct と union の値を返す場合に、可能な場合はレジスタを使用するように指定します。これは -fpcc-struct-return を 使 用 し た 場 合 と 比 較 し て、 小 さな構造体を返す場合に高い性能を発揮します。 -fpcc-struct-return と -freg-struct-return のどちらも使用しなかった場合には、GNU CC は各ターゲットに対して標準であると考えられる 方 をデフォルトとして使用します。もし標準がなかった場合は、 -fpcc-struct-return をデフォルトとして使用します。 -fshort-enums enum 型に対して、ちょうど取り得る値の範囲に応じたバイト数の型を与えます。具体的には、enum 型は、その値域を格 納するに十分な最小の整数型と等価になります。 -fshort-double double を float と同サイズにします。 -fshared-data データと非 const 変数を、プライベートなデータではなく、共有データとしてコンパイルします。このオプション は、 走 行中の同じプログラム間は共有データが共有され、プライベートデータがそれぞれのプロセスに 1 つずつ与えられる ような一部のオペレーティングシステムで意味を持ちます。 -fno-common Bss セクション中の初期化されていないグローバル変数に対してでも、共通ブロックに生成するのではなく、領域を割り 当 てます。このオプションは、(extern をつけずに) 同一の変数を宣言した 2 つのコンパイルに対して、リンク時にエ ラーを発生するという効果があります。このオプションは、常にこのような動作を行うシステムにおいても、プログラム が正常に動作するかどうかを検査する場合にのみ有用です。 -fno-ident `#ident' ディレクティブを無視します。 -fno-gnu-linker (C++ のコンストラクタとデストラクタのような) グローバルな初期化のコードを (GNU リンカがこれらを扱う標準のシ ステムであるようなシステムにおいて) GNU リンカで使用される形式で出力しません。これは GNU リンカではないリ ン カを使用する場合に指定します。この場合、 collect2 を使用して、確実にシステムリンカにコンストラクタとデストラ クタを含んだコードを出力させる必要があります。(collect2 は GNU CC のディストリビューションに含ま れ ま す。) collect2を 必 ず使用しなければならない システムにおいては、コンパイラドライバ gcc は自動的にそのようにコン フィギュレーションされます。 -finhibit-size-directive .sizeアセンブラディレクティブなど、関数が途中で分割され、メモリ上の異なった位置にそれぞれの部分が配置され る ような場合に不都合が生じるような要素を出力しません。このオプションは `crtstuff.c' をコンパイルする時に使用さ れます。それ以外の場所ではこれを使用する必要はありません。 -fverbose-asm 出力のアセンブラ中に特別なコメント情報を追加し、可読性を高めます。このオプションは一般的には、出力のアセンブ ラコードを本当に読みたい場合 (例えばコンパイラ自身をデバッグしているような場合) にのみ効果があります。 -fvolatile ポインタによるメモリの参照を全て volatile として扱います。 -fvolatile-global 外部変数やグローバルデータアイテムへのメモリ参照を全て volatile として扱います。 -fpic このオプションがターゲットマシンでサポートされていれば、位置独立なコードを出力します。このオプションは共有ラ イブラリでの使用に適します。 -fPIC このオプションがターゲットマシンでサポートされていれば、位置独立なコードを出力します。このオプションはダイナ ミックリンクに適しており、分岐において大きなディスプレースメントを要求する場合にも適応します。 -ffixed-reg 名 前が reg のレジスタを固定レジスタとして扱います。生成されたコードはこのレジスタを参照しません (ただし、ス タックポインタ、フレームポインタ、その他固定用途の場合を除きます)。 reg はレジスタ名でなければなりません。受 け付けられるレジスタ名はマシン固有であり、マシン記述マクロファイル内の REGISTER_NAMES マクロに記述されたもの です。このフラグは無効形式を持ちません。なぜなら、これは 3 通りの指定が可能であるからです。 -fcall-used-reg 名前が reg のレジスタを、関数呼び出しによっては破壊される割り当て可能のレジスタとして取り扱います。これ は、 関数呼び出しを跨いで存在しない一時領域や変数として割り当ることができます。この指定でコンパイルされた関数は、 レジスタ reg の保存や復帰を行いません。このフラグをマシンの実行モデルにおいて、ある固定的で特殊な役割を 持っ ているレジスタ、例えばスタックポインタやフレームポインタに対して適用することは、破滅的な結果を生みます。この フラグは無効形式を持ちません。なぜなら、これは 3 通りの指定が可能であるからです。 -fcall-saved-reg 名前が reg のレジスタを、関数によって保存される割り当て可能なレジスタとして取り扱います。これは、関数呼び 出 しを跨いで存在する一時領域や変数としても割り当てることができます。この指定でコンパイルされた関数は、レジスタ reg を使用する場合、その保存と復帰を行います。このフラグをマシンの実行モデルにおいて、ある固定的で特殊な役割 を 持っ ているレジスタ、例えばスタックポインタやフレームポインタに対して適用することは、破滅的な結果を生みま す。また、このフラグを関数の返り値が格納されるレジスタに使用すると、これも破滅的な結果を生みます。このフラグ は無効形式を持ちません。なぜなら、これは 3 通りの指定が可能であるからです。 プラグマ 2 つの `#pragma' ディレクティブが GNU C++ によってサポートされています。これは、1 つのヘッダファイルを 2 つの目的、 つまりあるオブジェクトクラスのためのインターフェースの定義としての目的と、オブジェクトクラスに含まれる内容の完全 な 定義としての目的の、両方の目的で使用するためのものです。 #pragma interface (C++ のみ) このディレクティブを、オブジェクトクラスを定義しているヘッダファイル中に使用することによって、そ れらのクラスを使用するほとんどのオブジェクトファイルの大きさを減少させることができます。通常は、特定の 情 報 (イ ンラインメンバ関数のバックアップコピー、デバッグ情報、仮想関数実現のための内部テーブル) はそのクラス定義 をインクルードしたそれぞれのオブジェクトファイル中に置かれる。このプラグマを使用することによって、このような 複製を防ぐことが可能となります。`#pragma interface' を含んだヘッダファイルをインクルードした場合は、これらの 追加情報は生成されません (ただし、メインの入力ソースファイル自身が `#pragma implementation' を含んでいる場合 を除きます)。そのかわり、オブジェクトファイルはリンク時に解決される参照を含むことになります。 #pragma implementation #pragma implementation "objects.h" (C++ のみ。) インクルードされたヘッダファイルによる完全な出力を生成させたい (またそれをグローバルに可視化し たい) 場合には、メインの入力ファイル中でこのプラグマを使用します。この場合、インクルードされるヘッダファイル は、`#pragma interface' を使用していなければなりません。インライン関数のバックアップ情報、デバッグ情報、仮想 関数実現用の内部テーブルは、全てインプリメンテーションファイル中に生成されま す。 `#pragma implementation' を、引数をつけずに使用した場合は、これはそのソースファイルと同じ基本名を持つファイルに対して適用されます。例 えば、`allclass.cc' 中の `#pragma implementation' は、`#pragma implementation "allclass.h" ' と等価です。 も し複数のヘッダファイルに対して、1 つのインプリメンテーションファイルを対応させたい場合は、文字列の引数を使用 する必要があります。 1 つのヘッダファイルに対して、複数のインプリメンテーションファイルを対応させる方法は あ りません。 関連ファイル file.c C 言語ソースファイル file.h C 言語ヘッダ (プリプロセッサ) ファイル file.i プリプロセス済みの C 言語ソースファイル file.C C++ ソースファイル file.cc C++ ソースファイル file.cxx C++ ソースファイル file.m Objective-C ソースファイル file.s アセンブラ言語ファイル file.o オブジェクトファイル a.out リンクエディット済みの出力 TMPDIR/cc* 一時ファイル群 LIBDIR/cpp プリプロセッサ LIBDIR/cc1 C 言語コンパイラ LIBDIR/cc1plus C++ コンパイラ LIBDIR/collect いくつかのマシンで必要となるリンカのフロントエンド LIBDIR/libgcc.a GCC サブルーチンライブラリ /lib/crt[01n].o スタートアップルーチン LIBDIR/ccrt0 C++ 用の付加的なスタートアップルーチン /lib/libc.a 標準ライブラリ, intro(3)を参照 /usr/include #include ファイルのための標準ディレクトリ LIBDIR/include #include ファイルのための GCC 標準ディレクトリ LIBDIR/g++-include #include ファイルのための付加的な g++ ディレクトリ LIBDIR は通常 /usr/local/lib/machine/version の形式を持ちます TMPDIR は環境変数 TMPDIR (もし使用可能ならば /usr/tmp を、そうでなければ /tmp を使用します) からとられます。 関連事項 cpp(1), as(1), ld(1), gdb(1), adb(1), dbx(1), sdb(1). info中の `gcc', `cpp', `as', `ld', `gdb' エントリ Using and Porting GNU CC (for version 2.0), Richard M. Stallman; The C Preprocessor, Richard M. Stallman; Debugging with GDB: the GNU Source-Level Debugger, Richard M. Stallman and Roland H. Pesch; Using as: the GNU Assembler, Dean Elsner, Jay Fenlason & friends; ld: the GNU linker, Steve Chamberlain and Roland Pesch. バグ バグを報告する方法については、GCC マニュアルを参照してください。 COPYING Copyright 1991, 1992, 1993 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English. 作者 GNU CC に対して貢献した人々に関しては、GNU CC マニュアルを参照してください。 日本語訳 細川 達己(hosokawa@mt.cs.keio.ac.jp) GNU Tools 30apr1993 1