extended |
コンパイルは ISO C++ 標準 を基にしますが、拡張言語フィーチャーの適応については若干の違いがあります。 |
[no]anonstruct |
このサブオプションは、無名の構造体と無名のクラスが C++ ソースで許可されるかどうかを制御します。
デフォルトでは、コンパイラーは無名の構造体を許可します。これは C++ 標準の拡張で、Microsoft(R) Visual C++ によって提供されている C++ コンパイラーとの互換性を持つ振る舞いを提供します。
無名の構造体は、以下のコード・フラグメントにあるように、たいていの場合は共用体で使用されます。
union U {
struct {
int i:16;
int j:16;
};
int k;
} u;
// ...
u.j=3;
このサブオプションが設定されていると、コードが無名の構造体を宣言し、
-qinfo=por が指定されている場合は、警告が出ます。
-qlanglvl=noanonstruct でビルドすると、
無名の構造体にエラーのフラグが付けられます。
標準 C++ に準拠する場合は、noanonstruct を指定してください。 |
[no]anonunion |
このサブオプションは、どのメンバーが無名の共用体で許可されるかを制御します。
このサブオプションが anonunion に設定されていると、無名の共用体は、
標準 C++ が無名の共用体以外で許可するすべての型のメンバーを持つことができます。
例えば、構造体、typedef、および列挙型などの非データ・メンバーは許可されます。
メンバー関数、仮想関数、または単純ではないデフォルト・コンストラクター、
コピー・コンストラクター、またはデストラクターを持つクラスのオブジェクトは、
このオプションの設定にかかわらず共用体のメンバーにはなれません。
デフォルトでは、コンパイラーは無名共用体の非データ・メンバーを許可します。これは標準 C++ の拡張で、VisualAge C++ の前のバージョンと先行製品、および Microsoft Visual C++ によって提供されている C++ コンパイラーとの互換性を持つ振る舞いを提供します。
このオプションが anonunion に設定されていると、
コードがその拡張子を使用した場合、
-qsuppress オプションで警告メッセージを抑止しない限り、警告が出ます。
標準 C++ に準拠する場合は、noanonunion を設定してください。 |
[no]ansifor |
このサブオプションは、C++ 標準に定義されているスコープ規則を for-init ステートメントで宣言されている名前に適用するかどうかを制御します。
デフォルトでは、標準 C++ 規則が使用されます。
例えば、以下のコードでは名前検索エラーが起こります。
{
//...
for (int i=1; i<5; i++) {
cout << i * 2 << endl;
}
i = 10; // error
}
エラーの理由は、i が、あるいは for-init ステートメント内で宣言されたいずれかの名前が、for ステートメント内でのみ可視であるからです。
このエラーを訂正するには、i をループの外で宣言するか、ansiForStatementScopes を no に設定します。
noansifor を設定して、古い言語の振る舞いを許可します。
これは、VisualAge C++ の旧版や先行製品、および Microsoft Visual C++ によって提供されたコンパイラーなど、他の製品を使用して開発されたコードに対して行う必要がある場合があります。 |
[no]ansisinit |
このオプションは、g++ -fuse-cxa-atexit と同様に機能し、静的デコンストラクターの完全な標準に準拠した処理のために必要です。 |
[no]c99__func__ |
このサブオプションは、C99 __func__ ID を認識するようコンパイラーに命令します。__func__ ID は、以下の暗黙宣言が存在するかのように振る舞います。
static const char __func__[] = function_name;
ここで、function_name は __func__ ID が現れる関数の名前です。
__func__ ID の効果は、以下のコード・セグメントで見ることができます。
void this_function()
{
printf("__func__ appears in %s", __func__);
}
これは実行されると、以下を出力します。
__func__ appears in this_function
c99__func__ サブオプションは、-qlanglvl=extended が有効な場合、デフォルトで使用可能です。これは
どの言語レベルでも、-qlanglvl=c99__func__ を指定して使用可能にすることができ、-qlanglvl=noc99__func__ を指定して使用不可にすることができます。
__C99__FUNC__ マクロは、c99__func__ が有効な場合は 1 に定義され、そうでない場合は定義されません。 |
[no]c99complex |
このサブオプションは C99 複素数データ型と関連キーワードを認識するようコンパイラーに命令します。
注:
複素数データ型に対するサポートは各種 C++ コンパイラーごとに異なるため、潜在的な移植性の問題を作り出します。このコンパイラー・オプションを -qinfo=por と共に指定すると、コンパイラーが移植性の警告メッセージを発行します。 |
[no]c99compoundliteral |
このサブオプションは C99 複合リテラル・フィーチャーをサポートするようコンパイラーに命令します。 |
[no]c99hexfloat |
このオプションは C++ アプリケーションで C99 スタイルの 16 進浮動小数点定数に対するサポートを使用可能にします。-qlanglvl=extended の場合、このサブオプションはデフォルトでオンになります。これが有効な場合、コンパイラーはマクロ __C99_HEX_FLOAT_CONST を定義します。 |
[no]c99vla |
c99vla が有効な場合、コンパイラーは C99 型可変長配列を C++
アプリケーションでサポートします。マクロ __C99_VARIABLE_LENGTH_ARRAY は 1 の値で定義されます。
注:
C++ アプリケーションでは、可変長配列によって使用されるよう割り振られているストレージは、それらの配列が常駐する関数が実行を完了するまで解放されません。 |
[no]dependentbaselookup |
デフォルトは -qlanglvl=dependentbaselookup です。
このサブオプションは、C++ 標準の TC1 の Issue 213 に準拠するコンパイルを指定する能力を提供します。
デフォルト設定は、従属型のテンプレート基底クラスの名前ルックアップに関して、以前の XL C/C++ コンパイラーの振る舞いを保存します。従属型である基底クラスのメンバーはテンプレート内で宣言されている名前、またはテンプレートのエンクロージング・スクープ内からの名前を隠します。
TC1 の準拠のために、-qlanglvl=nodependentbaselookup を指定します。 |
[no]gnu_assert |
以下の GNU C システム識別表明のサポートを使用可能または使用不可にするための GNU C 移植性オプションです。
- #assert
- #unassert
- #cpu
- #machine
- #system
|
[no]gnu_complex |
このサブオプションは GNU 複素数データ型と関連キーワードを認識するようコンパイラーに命令します。
注:
複素数データ型に対するサポートは各種 C++ コンパイラーごとに異なるため、潜在的な移植性の問題を作り出します。このコンパイラー・オプションを -qinfo=por と共に指定すると、コンパイラーが移植性の警告メッセージを発行します。 |
[no]gnu_computedgoto |
計算された goto に対するサポートを使用可能にする GNU C 移植性オプション。このサブオプションは、 -qlanglvl=extended に対して使用可能になり、マクロ__IBM_COMPUTED_GOTO を定義します。 |
[no]gnu_externtemplate |
このサブオプションは、extern テンプレートのインスタンス化を
使用可能または使用不可にします。
デフォルト設定は、extended 言語レベルにコンパイルする場合は nognu_externtemplate です。
gnu_externtemplate が有効な場合、明示的 C++ テンプレート・インスタンス化の前にキーワード extern を追加することによってテンプレートのインスタンス化が extern であると宣言することができます。
extern キーワードは、宣言内の
最初のキーワードでなければならず、extern キーワードは
1 つしか使用できません。
これは、クラスまたは関数のインスタンスを生成しません。
クラスおよび関数の両方で、extern テンプレートの
インスタンス化が、extern テンプレート・インスタンス化に先行する
コードによってトリガーされておらず、明示的にインスタンスを生成されているのでも、
明示的に特殊化されているのでもなければ、その extern テンプレートの
インスタンス化はテンプレートのパーツのインスタンス化を妨げます。
クラスの場合、静的データ・メンバーおよびメンバー関数のインスタンスは生成されませんが、
クラスをマップするために必要であれば、クラス自体のインスタンスは生成されます。
必要コンパイラー生成関数 (例えば、デフォルト・コピー・コンストラクター) の
インスタンスは生成されます。
関数の場合、プロトタイプのインスタンスは生成されますが、
テンプレート関数の本体のインスタンスは生成されません。
以下の例を参照してください。
template < class T > class C {
static int i;
void f(T) { }
};
template < class U > int C<U>::i = 0;
extern template class C<int>; // extern explicit
// template
// instantiation
C<int> c; // does not cause instantiation of
// C<int>::i or C<int>::f(int) in
// this file but class is
// instantiated for mapping
C<char> d; // normal instantiations
==========================
template < class C > C foo(C c) { return c; }
extern template int foo<int>(int); // extern explicit
// template
// instantiation
int i = foo(1); // does not cause instantiation
// of body of foo<int>
|
[no]gnu_include_next |
GNU C #include_next プリプロセッサー・ディレクティブのサポートを使用可能または
使用不可にするための GNU C 移植性オプションです。 |
[no]gnu_labelvalue |
値としてのラベルに対するサポートを使用可能または使用不可にするための GNU C 移植性オプション。このサブオプションは、 -qlanglvl=extended の場合はデフォルトでオンで、マクロ __IBM_LABEL_VALUE を定義します。 |
[no]gnu_locallabel |
ローカル宣言ラベルのサポートを使用可能または使用不可にするための GNU C 移植性オプションです。 |
gnu_membernamereuse |
typedef としてメンバー・リスト内のテンプレート名の再使用を使用可能にする GNU C++ 移植性オプション。 |
[no]gnu_suffixij |
GNU スタイルの複素数に対するサポートを使用可能または使用不可にするための GNU C 移植性オプション。gnu_suffixij が指定されている場合、複素数は i/I または j/J のサフィックスで終了することができます。 |
[no]gnu_varargmacros |
このオプションは -qlanglvl=varargmacros に似ています。主な違いは以下の通りです。
- オプションの変数引数 ID が省略符号の前に指定され、ID をマクロ __VA_ARGS__ の代わりに使用できるようにする。ID と省略符号の間に空白が表示されることがあります。
- 変数引数を省略することができる。
- トークン貼り付け演算子 (##) がコンマと変数引数の間に現れると、変数引数が提供されていない場合、プリプロセッサーがコンマ (,)を除去する。
- macro __IBM_MACRO_WITH_VA_ARGS が 1 に定義される。
例 1 - 単純な置換:
#define debug(format, args...) printf(format, args)
debug("Hello %s¥n", "Chris");
次のようにプリプロセスされます。
printf("Hello %s¥n", "Chris");
例 2 - 変数引数の省略:
#define debug(format, args...) printf(format, args)
debug("Hello¥n");
コンマはそのままで、次のようにプリプロセスされます。
printf("Hello¥n",);
例 3 - 変数引数が省略されるときにコンマを除去するためのトークン貼り付け演算子の使用:
#define debug(format, args...) printf(format, ## args)
debug("Hello¥n");
次のようにプリプロセスされます。
printf("Hello¥n"); |
[no]gnu_warning |
GNU C #warning プリプロセッサー・ディレクティブのサポートを使用可能または
使用不可にするための GNU C 移植性オプションです。 |
[no]illptom |
このサブオプションは、メンバーへのポインターを形成するのにどの式が使用できるかを制御します。
XL C++ コンパイラーは、共通に使用されるが、C++ 標準に準拠していない幾つかの形式を受け入れることができます。
コンパイラーはデフォルトでこれらの形式を許可します。これは標準 C++ の拡張で、VisualAge C++ の前のバージョン、その先行製品、および Microsoft Visual C++ によって提供されている C++ コンパイラーとの互換性を持つ振る舞いを提供します。
このサブオプションが illptom に設定されていると、
コードがその拡張子を使用した場合、
-qsuppress オプションで警告メッセージを抑止しない限り、警告が出ます。
例えば、以下のコードは、関数のメンバー p へのポインターを定義し、
それを古いスタイルで C::foo のアドレスへ初期設定します。
struct C {
void foo(int);
};
void (C::*p) (int) = C::foo;
C++ 標準に準拠する場合は、noillptom を設定してください。
上記のコード例では、& 演算子を使用するよう変更しなければなりません。
struct C {
void foo(int);
};
void (C::*p) (int) = &C::foo; |
[no]implicitint |
このサブオプションは、コンパイラーが欠落しているか部分的に指定されている型を
暗黙指定の int として受け入れるかどうかを制御します。これは、標準では現在受け入れられてはいませんが、既存のコードには存在する場合があります。
サブオプション・セットが noimplicitint に設定されている場合は、
すべての型が完全に指定されていなければなりません。
サブオプション・セットが implicitint に設定されている場合は、ネーム・スペース・スコープでの関数宣言、またはメンバー・リスト内の関数宣言は、int を戻すよう暗黙的に宣言されます。
また、型を完全に指定しない宣言指定子のシーケンスは、いずれも、整数型を暗黙的に指定します。
あたかも int 指定子が存在しているかのような効果がありますので、注意してください。
これはつまり、指定子 const が自ら定数整数を指定することを意味します。
以下の指定子は、型を完全に指定しません。
- auto
- const
- extern
- extern "<literal>"
- inline
- mutable
- friend
- register
- static
- typedef
- virtual
- volatile
- プラットフォーム特定の型 (例えば、_cdecl)
型が指定されている状態は、いずれも、このサブオプションの影響を受けるので、
注意してください。
これには、例えば、テンプレート型およびパラメーター型、例外指定、
式における型 (casts、dynamic_cast、new など)、および変換関数の型が含まれます。
コンパイラーはデフォルトで -qlanglvl=implicitint を設定します。これは C++ 標準の拡張で、VisualAge C++ の前のバージョンと先行製品、および Microsoft Visual C++ によって提供されている C++ コンパイラーとの互換性を持つ振る舞いを提供します。
例えば、関数 MyFunction の戻りの型は、以下のコードで省略されたため、int です。
MyFunction()
{
return 0;
}
標準 C++ に準拠する場合は、-qlanglvl=noimplicitint を設定してください。
例えば、上記の関数宣言は以下のように変更する必要があります。
int MyFunction()
{
return 0;
} |
[no]offsetnonpod |
このサブオプションは、offsetof マクロを、データだけでないクラスに適用できるかどうかを制御します。C++ プログラマーはよくデータだけのクラスを「Plain Old Data」(POD) クラスと呼びます。
コンパイラーはデフォルトで、offsetof を POD でないクラスに使用することを許可します。これは
C++ 標準の拡張で、VisualAge C++ for OS/2(R) 3.0、 VisualAge for C++ for Windows(R)、バージョン 3.5、および Microsoft Visual C++ によって提供されている C++ コンパイラーとの互換性を持つ振る舞いを提供します。
このオプションが設定されていると、コードがその拡張子を使用した場合、
-qsuppress オプションで警告メッセージを抑止しない限り、警告が出ます。
標準 C++ に準拠する場合は、-qlanglvl=nooffsetnonpod を設定してください。
コードが次のいずれか 1 つを含むクラスへ offsetof を適用する場合は、-qlanglvl=offsetnonpod を設定してください。
- ユーザー宣言のコンストラクターまたはデストラクター
- ユーザー宣言の代入演算子
- private または protected 非静的データ・メンバー
- 基底クラス
- 仮想関数
- メンバーへの型ポインターの非静的データ・メンバー
- 非データ・メンバーを持つ構造体または共用体
- 参照
|
[no]olddigraph |
このオプションは、古いスタイルの連字が C++ ソースで許可されるかどうかを制御します。
これは、-qdigraph も設定されている場合にのみ適用されます。
コンパイラーはデフォルトで、C++ 標準に指定された連字のみをサポートします。
以下の連字のうち少なくとも 1 つがコードに含まれている場合は、-qlanglvl=olddigraph を設定します。
- 連字
- 結果の文字
- %%
- # (ポンド記号)
- %%%%
- ## (ダブル・ポンド記号、プリプロセッサー・マクロの連結演算子として使用される)
標準 C++ および VisualAge C++ の前のバージョンおよび先行製品によってサポートされている拡張 C++ 言語レベルとの互換性のために、-qlanglvl=noolddigraph を設定します。 |
[no]oldfriend |
このオプションは、
詳述されたクラス名なしでクラスを指定するフレンド宣言を C++ エラーとして取り扱うかどうかを制御します。
デフォルトで、コンパイラーはキーワード・クラスを持つクラスの名前を詳述せずにフレンド・クラスを宣言できるようになっています。これは C++ 標準の拡張で、VisualAge C++ の前のバージョンと先行製品、および Microsoft Visual C++ によって提供されている C++ コンパイラーとの互換性を持つ振る舞いを提供します。
例えば、下記のステートメントは、クラス IFont がフレンド・クラスになるように宣言し、
oldfriend サブオプションが設定されている場合に有効です。
friend IFont;
標準 C++ に準拠する場合は、nooldfriend サブオプションを設定してください。
上記の宣言例は、下記のステートメントに変更するか、または
-qsuppress オプションで警告メッセージを抑止しない限り、
警告を出します。
friend class IFont; |
[no]oldtempacc |
このサブオプションは、一時オブジェクトの作成が回避される場合でも、
一時オブジェクトの作成のためのコピー・コンストラクターへのアクセスを常に検査するかどうかを制御します。
デフォルトで、コンパイラーはアクセス検査を抑止します。
これは C++ 標準の拡張で、VisualAge C++ for OS/2 3.0、 VisualAge for C++ for Windows、バージョン 3.5、および Microsoft Visual C++ によって提供されている C++ コンパイラーとの互換性を持つ振る舞いを提供します。
このサブオプションが yes に設定されていると、コードがその拡張子を使用した場合、
-qsuppress で警告メッセージを使用禁止にしない限り、警告が出ます。
標準 C++ に準拠する場合は、-qlanglvl=nooldtempacc を設定してください。
例えば、以下のコードの throw ステートメントは、コピー・コンストラクターがクラス C の protected メンバーであるため、エラーの原因となります。
class C {
public:
C(char *);
protected:
C(const C&);
};
C foo() {return C("test");} // return copy of C object
void f()
{
// catch and throw both make implicit copies of
// the thrown object
throw C("error"); // throw a copy of a C object
const C& r = foo(); // use the copy of a C object
// created by foo()
}
上記のコード例では、3 個所にコピー・コンストラクター C(const C&) の誤った形式が使用されています。 |
[no]oldtmplalign |
このサブオプションは、バージョン 5.0 より前のバージョンのコンパイラー (xlC) でインプリメントされている位置合わせ規則を指定します。
これら初期のバージョンの xlC コンパイラーは、ネスト・テンプレート用に指定された位置合わせ規則を無視します。
デフォルトでこれらの位置合わせ規則は、VisualAge C++ 4.0 以降では無視されません。例えば、次のテンプレートでは、A<char>::B のサイズは -qlanglvl=nooldtmplalign の場合は 5、
-qlanglvl=oldtmplalign の場合は 8 となります。
template <class T>
struct A {
#pragma options align=packed
struct B {
T m;
int m2;
};
#pragma options align=reset
}; |
[no]oldtmplspec |
このサブオプションは、
C++ 標準に準拠していないテンプレートの特殊化を許可するかどうかを制御します。
デフォルトで、コンパイラーはこれらの特殊化を許可します (-qlanglvl=nooldtmplspec)。これは標準 C++ の拡張で、VisualAge C++ for OS/2 3.0、 VisualAge for C++ for Windows、バージョン 3.5、および Microsoft Visual C++ によって提供されている C++ コンパイラーとの互換性を持つ振る舞いを提供します。
-qlanglvl=oldtmplspec が設定されていると、コードがその拡張子を使用した場合、
-qsuppress オプションで警告メッセージを抑止しない限り、警告が出ます。
例えば、以下の行を使用して、char 型のテンプレート・クラス・リボンを明示的に特殊化することができます。
template<class T> class ribbon { /*...*/};
class ribbon<char> { /*...*/};
標準 C++ に準拠する場合は、-qlanglvl=nooldtmplspec を設定してください。
上記の例では、テンプレートの特殊化は以下のように変更する必要があります。
template<class T> class ribbon { /*...*/};
template<> class ribbon<char> { /*...*/}; |
[no]redefmac |
事前の #undef または undefine() 文なしでマクロを再定義できるかどうかを指定します。 |
[no]trailenum |
このサブオプションは、enum 宣言で末尾のコンマを許可するかどうかを制御します。
デフォルトでは、コンパイラーは、
列挙子リストの最後に 1 つまたはそれ以上の末尾のコンマを許可します。
これは C++ 標準の拡張で、Microsoft Visual C++ との互換性を提供します。
以下の enum 宣言はこの拡張を使用します。
enum grain { wheat, barley, rye,, };
標準 C++ 、または VisualAge C++ の以前のバージョンおよび先行の製品でサポートされている
stdc89 言語レベルとの互換性のために、-qlanglvl=notrailenum を設定します。 |
[no]typedefclass |
このサブオプションは、VisualAge C++ の前のバージョンおよび先行プロダクトとの後方互換性を提供します。
現在の C++ 標準は、クラス名を指定するはずの個所に typedef の名前を指定することを許可しません。
このオプションは、この制限を緩和します。
基本指定子リストおよびコンストラクター初期化指定子リストの typedef 名の使用を許可するには、-qlanglvl=typedefclass を設定します。
デフォルトでは、typedef 名はクラス名を指定するはずの個所に指定することはできません。 |
[no]ucs |
このサブオプションは、ユニコード文字が、C++ ソースの ID、ストリング・リテラル、および文字リテラルで許可されるかどうかを制御します。
デフォルト設定は -qlanglvl=noucs です。
ユニコード文字セットは、C++ 標準でサポートされています。
この文字セットには、北米および西ヨーロッパのすべての言語を含む、幅広い範囲の言語に使用される文字、数字、およびその他の文字の全セットが含まれています。
ユニコード文字は、16 ビットまたは 32 ビットが可能です。
ASCII の 1 バイト文字は、ユニコード文字セットのサブセットです。
-qlanglvl=ucs が使用可能になっている場合は、ソース・ファイルに直接、あるいはエスケープ・シーケンスに似た表記を使用して、ユニコード文字を挿入することができます。ユニコード文字の多くが、画面に表示できない、またはキーボードから入力できないため、
通常は、後者の方法が好まれています。
ユニコード文字の表記形式は、16 ビット文字の場合は ¥uhhhh、32 ビット文字の場合は ¥Uhhhhhhhh です。ここで、h は 16 進数字を表します。文字の短縮 ID は、ISO/IEC 10646 によって指定されます。 |
[no]varargmacros |
この C99 フィーチャーは、C++ アプリケーションでの関数の似たマクロでの変数引数リストの使用を許可します。構文は変数引数関数に似ており、printf のマスキング・マクロとして使用することができます。
例:
#define debug(format, ...) printf(format, __VA_ARGS__)
debug("Hello %s¥n", "Chris");
次のようにプリプロセスされます:
printf("Hello %s¥n", "Chris");
置換リストの token __VA_ARGS__ は、パラメーターの省略符号に対応します。省略符号はマクロ呼び出しの可変引数を表します。
varargmacros を指定すると、マクロ __C99_MACRO_WITH_VA_ARGS が 1 の値に定義されます。 |
[no]zeroextarray |
このサブオプションは、
ゼロ範囲の配列をクラス定義で最後の非静的データ・メンバーとして許可するかどうかを制御します。
デフォルトでは、コンパイラーはゼロ・エレメントを持つ配列を許可します。
これは C++ 標準の拡張で、Microsoft Visual C++ との互換性を提供します。
下記の宣言例は、無次元配列 a および b を定義します。
struct S1 { char a[0]; };
struct S2 { char b[]; };
標準 C++ または VisualAge C++ の前のバージョンおよび先行製品によってサポートされる ANSI 言語レベルとの整合性のために、nozeroextarray を設定します。 |