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++ が匿名の共用体以外で許可するすべての型のメンバーを持つことができます。例えば、struct、typedef、および enumeration などの非データ・メンバーは許可されます。
メンバー関数、仮想関数、または単純ではないデフォルト・コンストラクター、コピー・コンストラクター、またはデストラクターを持つクラスのオブジェクトは、このオプションの設定にかかわらず共用体のメンバーにはなれません。
デフォルトでは、コンパイラーは匿名の共用体の非データ・メンバーを許可します。これは、標準 C++ を拡張したものであり、VisualAge(R)
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
-qlanglvl=extended が有効な場合、c99__func__ サブオプションはデフォルトで使用可能です。
-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 のためにデフォルトでオンです。有効な場合は、コンパイラーは macro __C99_HEX_FLOAT_CONST を定義します。
|
[no]c99vla
| c99vla が有効な場合、コンパイラーは C++ アプリケーションで C99 型可変長配列の使用をサポートします。
macro __C99_VARIABLE_LENGTH_ARRAY は値 1 で定義されます。
- 注:
- C++ アプリケーションでは、可変長配列によって使用するために割り振られるストレージは、常駐する関数が実行を完了するまでリリースされません。
|
[no]dependentbaselookup
| デフォルトは -qlanglvl=dependentbaselookup です。
このサブオプションを使用すると、C++ Standard の TC1 の
Issue 213 に準拠したコンパイルを指定することができます。
デフォルト設定では、従属型のテンプレート基底クラスの名前検索に関して、以前の
XL 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 に使用可能で、macro __IBM_COMPUTED_GOTO を定義します。
|
[no]gnu_explicitregvar
| 変数の明示的レジスターの指定をコンパイラーが受け入れて無視するかどうかを制御するための GNU C 移植性オプションです。
|
[no]gnu_externtemplate
| このサブオプションは、extern テンプレートのインスタンス化を使用可能または使用不可にします。
デフォルト設定は、拡張言語レベルへコンパイルするときは
gnu_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 のためにデフォルトでオンであり、macro __IBM_LABEL_VALUE を定義します。
|
[no]gnu_locallabel
| ローカル宣言ラベルのサポートを使用可能または使用不可にするための GNU C 移植性オプションです。
|
gnu_membernamereuse
| メンバー・リストのテンプレート名を typedef として再使用可能にする GNU C 移植性オプション。
|
[no]gnu_suffixij
| GCC スタイル複合メンバーのサポートを使用可能または使用不可にするための GNU C 移植性オプションです。
gnu_suffixij が指定される場合、複素数はサフィックス i/I または j/J で終わることができます。
|
[no]gnu_varargmacros
| このオプションは -qlanglvl=varargmacros と同様です。主な違いは以下のとおりです。
- オプションの可変引き数 ID が省略符号の前に置かれ、macro __VA_ARGS__ の代わりに ID を使用可能にする。空白が 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++ Standard
には準拠していない、いくつかの形式を受け入れることができます。
デフォルトで、コンパイラーはこれらの形式を許可します。これは、標準 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)
型が指定されている状態は、いずれも、このサブオプションの影響を受けるので、注意してください。これには、例えば、テンプレート型およびパラメーター型、例外指定、式における型 (eg、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++ のプログラマーは、データのみのクラスを "プレーンな古いデータ" (POD) のクラスと普段よく呼んでいます。
デフォルトでは、コンパイラーは offsetof を non-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
| このオプションは、古いスタイルの digraph が C++ ソースで許可されるかどうかを制御します。これは、-qdigraph も設定されている場合にのみ適用されます。
デフォルトでは、コンパイラーは、C++ 標準で指定された
digraph のみをサポートします。
以下の digraph のうち少なくとも 1 つがコードに含まれている場合は、
-qlanglvl=olddigraph を設定します。
- Digraph
- 結果の文字
- %%
- # (ポンド記号)
- %%%%
- ## (ダブル・ポンド記号、プリプロセッサー・マクロの連結演算子として使用される)
以前のバージョンの VisualAge
C++ および以前に使用されていた製品でサポートされる標準 C++ および拡張 C++
言語レベルとの互換性を維持するには、-qlanglvl=noolddigraph を設定します。
|
[no]oldfriend
| このオプションは、詳述されたクラス名なしでクラスを指定するフレンド宣言を C++ エラーとして取り扱うかどうかを制御します。
デフォルトでは、コンパイラーは、キーワード・クラスを持つクラスの名前を詳述せずにフレンド・クラスを宣言できるようになっています。これは、C++ 標準を拡張したものであり、以前のバージョンの
VisualAge C++
および以前に使用されていた製品、および
Microsoft Visual
C++ で提供された C++ コンパイラーと互換性のある振る舞いが行われるようにします。
例えば、下記のステートメントは、クラス IFont がフレンド・クラスになるように宣言し、
oldfriend サブオプションが specified に設定されている場合に有効です。
friend IFont;
標準 C++ に適合している場合は、nooldfriend サブオプションを設定してください。上記の宣言例は、下記のステートメントに変更するか、または
-qsuppress オプションで警告メッセージを抑止しない限り、警告を出します。
friend class IFont;
|
[no]oldtempacc
| このサブオプションは、一時オブジェクトの作成が回避される場合でも、一時オブジェクトの作成のためのコピー・コンストラクターへのアクセスを常に検査するかどうかを制御します。
デフォルトでは、コンパイラーはアクセス検査を抑制します。これは、C++ 標準を拡張したものであり、VisualAge
C++ for OS/2(R)
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");
置換リストのトークン __VA_ARGS__ は、パラメーターの省略符号に対応します。省略符号は、マクロ呼び出しの可変引き数を示します。
varargmacros を指定すると、macro __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 を設定します。
|