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

2.5 C++ 方言を扱うオプション

この節では、C++ プログラムの場合にのみ意味のあるコマンド行オプションを 説明する。 だが、GNU コンパイラのオプションの大部分は、プログラムの言語が 何であるかに関わらず使うことができる。 例えば、firstClass.C というファイルを以下のようにコンパイル 出来る。

 
g++ -g -frepo -O -c firstClass.C

この例では、‘-frepo’ だけが、C++ プログラムの 場合にだけ意味を持つオプションである。 他のオプションは、GCC がサポートしているどの言語でも使用できる。

以下のリストは、C++ プログラムをコンパイルする場合にのみ意味のある オプションである。

-fno-access-control

全てのアクセス検査を行なわない。 これは、主にアクセス制御コードのバグを回避するためにある。

-fcheck-new

operatr new により返されるポインタがヌルでないことを、 確保した領域を変更する前に、検査する。 最新の ANSI C++ の "Working Paper" では、operator new は 決してヌルポインタを返さないことを要求しているので、 この検査は普通は必要でない。

このオプションの代わりとなる方法としては、自作の operator new がなんら例外を投げないと指定する方法がある。‘throw()’ と 宣言すると、g++ は戻り値を検査する。‘new (nothrow)’ も 参照のこと。

-fconserve-space

非初期化、あるいは実行時初期化グローバル変数を C の場合のように、 コモンセグメントに置く。 これは、二重定義を検査しないというコストを払ったうえで、実行形式中の スペースを節約する。 このオプションをつけてコンパイルしたプログラムが、main() の 終了後に、不可解にも異常終了したなら、二つの定義がマージされたために 二回破壊されるオブジェクトが存在する可能性がある。

このオプションはもはやほとんどのターゲットで意義がなくなっている。 変数を、コモンにすることなく BSS に置く方法がサポートされているからである。

-fdollars-in-identifiers

識別子中に ‘$’ を使うことを許す。‘-fno-dollars-in-identifiers’ オプションを使って、‘$’ を明示的に使用禁止にすることも可能である。 (GNU C は、ほとんどのターゲットでデフォルトで ‘$’ を許すが、 2,3 の例外がある。) 旧来の C は、識別子の一部に ‘$’ を使うことを許している。 しかし、ANSI C と C++ は、識別子中の ‘$’ を禁止している。

-fno-elide-constructors

C++ 規格は、同じ型の別のオブジェクトを初期化するのにしか使われない 一時オブジェクトを作るのを省略する実装を許している。 このオプションを指定すると、その最適化を無効にし、g++ が 全ての場合にコピー・コンストラクタを呼ぶようにする。

-fexternal-templates

テンプレートの実体化を ‘#pragma interface’ と ‘implementation’ に従わせる。テンプレートの実体が生成されるか、テンプレート定義の 位置には従わない。 詳細については See section テンプレートはどこ

このオプションは廃止要求が出ている。

-falt-external-templates

-fexternal-templates’ と同様だが、 テンプレートの実体は生成されるか、最初に実体化された場所には従わない。 詳細については See section テンプレートはどこ

このオプションは廃止要求が出ている。

-ffor-scope
-fno-for-scope

-ffor-scope が指定されると、for 文の初期化文で宣言された変数の 有効範囲は、その ‘for’ ループ自体に限られる。 これは、C++ 規格のドラフトで規定されている動作である。 -fno-for-scope が指定された場合は、for 文の初期化文で宣言された 変数の有効範囲は、for 文を囲む有効範囲の最後までとなる。 これは、gcc の古いバージョンや、他の(古い) C++ の実装での 動作である。

どちらのオプションも指定されない場合のデフォルトは規格に従うが、 無効であったり、異なる動作にならない限り、古い形式のコードも 警告がでるが許される。

-fno-gnu-keywords

classofheadofsignaturesigoftypeof をキーワードとして認識せず、識別子として使えるように する。その場合、代わりに __classof____headof____signature____sigof____typeof__ を使うことができる。 ‘-ansi’ は ‘-fno-gnu-keywords’ を含む。

-fguiding-decls

潜在的な関数テンプレートの実体化と同じ型を持つ関数の宣言があったとき、 それを普通の関数としてではなく、あたかも実体化を宣言しているかのように 扱う。その関数の定義が、同じ翻訳単位の後ろで与えられていれば (あるいは、ターゲットにウィークシンボルがあれば、別の翻訳単位でも 良い)、その定義が使われる。定義がければ、そのテンプレートは 実体化される。この動作は、1996年9月以前の C++ 言語仕様を 反映したものであり、この後、案内宣言(guiding declaration)が 仕様から削除された。

このオプションを指定すると、‘-fname-mangling-version-0’ も 指定したことになるので、これ以外の名前のエンコード版(name mangling version) と一緒には使えない。ABI を変更する全てのオプション同様、 libgcc.a を含む全ての C++ コードをこのオプションの設定を 同一にして構築しなければならない。

-fhandle-signatures

抽象型を指定するキーワード、 signaturesigof を認識する。 デフォルト(‘-fno-handle-signatures’) では認識しない。

-fhonor-std

namespace std をネームスペースとして、無視せずに取り扱う。 g++ の昔のバージョンとの互換性のために、GCC は デフォルトでは namespace-declarationsusing-declarationsusing-declarationsusing-directivesnamespace-names が、std を含んでいれば、それを無視する。

-fhuge-objects

short int’ で表現可能な大きさを越えるオブジェクトについて 仮想関数呼び出しをサポートする。 ユーザはデフォルトではこのオプションを使うべきでない。 このオプションを使う必要があるときは、コンパイラが知らせてくれる。

このオプションは、-fvtable-thunks を使ってコンパイルした場合には 役に立たない。

ABI を変更する全てのオプション同様、 libgcc を含む全ての C++ コードをこのオプションの設定を 同一にして構築しなければならない。

-fno-implicit-templates

暗黙に(すなわち、使うことにより)実体化される非インラインのテンプレート用の コードを生成しない。明示的な実体化に対してのみコードを生成する。 より詳細については、See section テンプレートはどこ

-fno-implicit-inline-templates

インラインテンプレートの暗黙の実体化についてのコードも生成しない。 デフォルトはインラインを違ったやり方で取扱うので、最適化ありでもなしでも、 コンパイラは明示的な実体化の同じセットが必要になる。

-finit-priority

__attribute__ ((init_priority (n)))’ をサポートし、 ファイルスコープのオブジェクトの初期化順序を制御できるようにする。 ELF ターゲットでは、このためには GNU ld 2.10 以降が必要である。

-fno-implement-inlines

スペースの節約のために、‘#pragma implementation’ により制御される インライン展開関数の展開コードのコピーを生成しない。 こうすると、インライン展開関数が、どの呼び出し個所でもインライン 展開されないと、リンク時のエラーになる。

このオプションは、C++ リンケージの宣言には影響しない。

-fname-mangling-version-n

名前のマングル方法を制御する。 バージョン 0 は、2.8 以前の g++ のバージョンと互換である。 バージョン1がデフォルトである。 バージョン1 は、関数テンプレートの正しいマングルが可能である。 例えば、バージョン 0 のマングルでは、foo<int, double> をマングルせず、 foo<int, char> は以下の宣言になる。

 
template <class T, class U> void foo(T t);

ABI を変更する全てのオプション同様、 libgcc を含む全ての C++ コードをこのオプションの設定を 同一にして構築しなければならない。

-foperator-names

演算子名キーワード、andbitandbitorcomplnotorxor を それらが参照する記号の別名として認識する。 ‘-ansi’ には ‘-foperator-names’ が含まれる。

-fno-optional-diags

規格がコンパイラが発行する必要はないと規定している診断メッセージを 出さないようにする。現在、g++ が発行する診断メッセージで 該当するのは、ある名前があるクラス内で複数の意味を持っているというものに 対するものである。

-fpermissive

規格に準拠していないコードについてのメッセージをエラーから 警告に格下げする。デフォルトでは、g++ は ‘-pedantic’ を 指定しない場合は実質的に ‘-pedantic-errors’ を指定している。 このオプションはそれを逆にする。この動作とオプションは、‘-pedantic’ により打ち消される。‘-pedatnic’ は GNU C の場合と同様の動作になる。

-frepo

自動的なテンプレートの実体化を有効にする。このオプションは、 暗黙に ‘-fno-implicit-templates’ も設定する。 もっと詳しいことについては、 See section テンプレートはどこ

-fno-rtti

C++ の実行時型識別機能(‘dynamic_cast’ と ‘typeid’)で 使われる情報を生成しない。C++ 言語のこれらの機能(あるいは、 ‘dynamic_cast’ を内部的に使っている例外処理)を使わないのであれば、 このオプションを指定することでスペースをいくらか節約できる。

-fstrict-prototype

リンケージ指定 ‘extern "C"’ の中で、引数なしの関数宣言、 例えば ‘int foo ();’ を、引数を取らない関数の宣言として扱う。 普通 C では、そのような宣言は関数 foo はどんな引数の組合せでも 取ることができることを意味する。 ‘-pedantic ’ は、‘-fno-strict-prototype’ が指定されていない限り、 ‘-fstrict-prototype’ も有効にする。

このオプションを指定すると、暗黙の関数宣言も抑制する。

このオプションは、C++ リンケージを持つ宣言には、もはや影響しない。

-fsquangle
-fno-squangle

-fsquangle’ を指定すると、識別子の名前のマングリングの 圧縮形を有効にする。これは、特に、複数回現れる型名とクラス名を 認識し、特別に短い ID コードで置き換えることで、 非常に長い名前を短くするのを助ける。このオプションを指定するなら、 一緒に使うどの C++ ライブラリも同様にこのオプションを指定して コンパイルする必要がある。デフォルトで無効になっている (‘-fno-squangle’ を指定したのと同じ)。

ABI を変更するような全てのオプション同様、libgcc.a を含む 全ての C++ コードを、このオプションについて同じ設定で構築しなければ ならない。

-ftemplate-depth-n

テンプレートクラスの実体化の最大の深さを n にする。 テンプレート実体化の深さは、テンプレートクラス実体化の際に無限に 再帰が起こるのを検出するのに必要である。ANSI/ISO C++ に適合する プログラムは、17 より大きい最大の深さに頼ってはならない。

-fthis-is-variable

this への代入を許す。 ユーザ定義のフリーストア管理を C++ に取り込んだことにより、 ‘this’ への代入は時代遅れになった。 このため、デフォルトではクラスのメンバ関数内で this に 代入することは無効である。すなわち、GNU C++ は、 クラス X のメンバ関数中の this を ‘X *’ 型の非左辺値として取り扱う。 しかし、以前との互換性のために、‘-fthis-is-variable’ を 指定することで有効とすることができる。

-fvtable-thunks=thunks-version

サンク’ を使って仮想関数のディスパッチテーブル(‘vtable’)を 実装する。vtable を実装する旧来の方法(cfrontの方法)では、 仮想関数へのポインタと、呼び出し側で ‘this’ ポインタを調整する ための二つのオフセットを格納していた。 新しい実装方法では、ある‘サンク’関数への一個のポインタを格納する。 そのサンク関数が必要な調整を行ったうえで目的の関数を呼び出す。

サンクの最初の実装(バージョン1)には、仮想基底クラスに関するバグが あった。このバグは、サンクの実装のバージョン 2 で修正されている。 バージョンを 2 に指定すると、バージョン 1 のサンクとの互換性が 保たれるが、余分な機械語コードがかかる。バージョン 3 にはこの 互換性はない。

このオプションはまた、発見的方法を使って、仮想関数テーブルの生成を 制御する。 あるクラスに一つでも非インライン仮想関数があれば、その非インライン関数の うちの先頭の一つを含む翻訳単位に、vtable が射出される。

ABI を変更する全てのオプション同様、 libgcc.a を含む全ての C++ コードをこのオプションの設定を 同一にして構築しなければならない。バージョン 1 とバージョン 2 も 非互換である(仮想関数を定義している仮想基底をもつクラスについて)、 全てのコードを同じバージョンでコンパイルしなければならない。

このバージョンの gcc では、バージョン 2 のサンクがデフォルトになっている ターゲットはない。全てのターゲットで、オプションを指定しないと 旧来の実装を使い、-fvtable-thunks を指定するとバージョン 2 のサンクを 生成する。

-nostdinc++

ヘッダファイルを、C++ 固有の標準ディレクトリから探さない。 だが、他の標準ディレクトリに対しては検索を行なう。 (このオプションは、GNU の C++ ライブラリを構築するときに使われる。)

さらに、以下の最適化、警告、コード生成に関するオプションは C++ プログラムの場合にのみ意味を持つ。

-fno-default-inline

クラススコープ内で定義されている関数に ‘inline’ を仮定しない。 See section Options That Control Optimization. こういう関数はインライン関数と似たリンケージを持つ。 単にデフォルトではインライン展開されないのである。

-Wctor-dtor-privacy (C++ のみ)

クラスが使用不可能だと思える場合に警告を出す。 これは、クラスの全てのコンストラクタまたはデストラクタが private であり、friend や public static のメンバ関数が無いときである。

-Wnon-virtual-dtor (C++ のみ)

クラスが、おそらく virtual でなくてはいけないデストラクタを 非 virtual と宣言しているときに警告を出す。多相的に使われるであろう クラスに見えるからである。

-Wreorder (C++ のみ)

コードで示されたメンバの初期化順序と、実際に実行するときに従わなければ ならない順序が一致しないときに、警告する。 例えば、以下のコードを考える。

 
struct A {
  int i;
  int j;
  A(): j (0), i (1) { }
};

ここでコンパイラは、‘i’ と ‘j’ についてのメンバ初期化が、 メンバの宣言順序に一致するように並べ変えられるという警告を出す。

以下の ‘-W…’ オプションは ‘-Wall’ には影響されない。

-Weffc++ (C++ のみ)

Scott Meyers の「Effective C++」で述べられているスタイルの指針から 外れている様々なものについて警告する。 このオプションを使う場合は、標準ライブラリヘッダがこれらの指針の全てには 従っていないという点に注意する必要がある。‘grep -v’ を 使って、そういう警告を取り除く事ができる。

-Wno-deprecated (C++ のみ)

廃止要求が出ている機能を使った場合の警告を出さない。 See section 消えた機能.

-Wno-non-template-friend (C++ のみ)

テンプレート化されていないフレンド関数がテンプレート内で宣言されている 時の警告を出さないようにする。 明示的なテンプレート指定が g++ でサポートされたことにより、 そのフレンドの名前が修飾子無しの識別子(例えば、‘friend foo(int)’) なら、C++ 言語規格ではそのフレンドが通常の、非テンプレート関数を 宣言するか定義することを要求している。(14.5.3節。) g++ が明示的な規定を実装する前は、修飾子無しの識別子は、テンプレート化 された関数の特定の特殊化と解釈可能であった。この規格に合致しない 動作はもはや g++ のデフォルトの動作ではないので、 ‘-Wnon-teplate-friend’ を指定すると GCC は既存のコードの中から 潜在的に問題になりそうなところを検査する。これはデフォルトで有効に なっている。この新しい動作は ‘-fguiding-decls’ オプションでも 無効にすることができる。このオプションは、昔の、指定無しのコンパイラの コードを有効にする。あるいは、‘-Wno-non-template-friend’ を 指定すると、規格に準拠したコンパイラのコードを保持するが、役に立つ 警告は出なくなる。

-Wold-style-cast (C++ のみ)

C++ プログラムで古い形式(C言語形式)のキャストが使われている場合、 警告を出す。新しい形式のキャスト(‘static_cast’、 ‘reinterpret_cast’、‘const_cast’) は、予期しない効果を 受けにくい。

-Woverloaded-virtual (C++ のみ)

導出クラスの関数宣言が仮想関数の定義でエラーになりうる場合に 警告する。導出クラスでは、仮想関数の定義は、基底クラスの 仮想関数宣言の型シグネチャに一致しなければならない。 このオプションを指定すると、コンパイラは、仮想関数と同じ名前だが、 型シグネチャが基底クラスのどの宣言にも一致しない関数を定義すると 警告を出す。

-Wno-pmf-conversions (C++ のみ)

メンバ関数へ結び付いたポインタを普通のポインタに変換するときの診断 メッセージを無効にする

-Wsign-promo (C++ のみ)

多重定義の解決の際に、unsigned 型または列挙型から signed 型への 格上げが、同じ大きさの unsigned 型への変換を越えて選択されたときに 警告を出す。以前のバージョンの g++ は、unsigned 性を保存することを 試みていたが、規格が現在の動作を要求しているのである。

-Wsynth (C++ のみ)

g++の合成の振るまいが cfront のものと一致しない場合に警告する。 例えば、

 
struct A {
  operator int ();
  A& operator = (int);
};

main ()
{
  A a,b;
  a = b;
}

という例では、g++ はデフォルトの ‘A& operator = (const A&);’ を 合成するが、cfront はユーザ定義の ‘operator =’ を使う。


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

This document was generated using texi2html 1.78.