langlvl

C に適用 C++ に適用

目的

コンパイル用の言語レベルと言語オプションを選択します。

構文

                    .-:---------.
                    V           |
>>- -q--langlvl--=----suboption-+------------------------------><
 
 

ここで、suboption については、以下の『』セクションで説明します。

#pragma langlvlおよび #pragma optionsも参照してください。

デフォルト

デフォルトの言語レベルは、コンパイラーの呼び出しに使用するコマンドに応じてそれぞれ異なります。

呼び出し
デフォルトの言語レベル

xlC/xlc++
extended

xlc
extc89

cc
extended

c89
stdc89

c99
stdc99

C に適用 以下のプラグマ・ディレクティブのいずれかを使用して、C 言語ソース・プログラムで言語レベルを指定することもできます。

#pragma options langlvl=suboption
#pragma langlvl(suboption)

pragma ディレクティブは、ソース・コードのどの非コメント行よりも前に指定しなければなりません。

C に適用 C プログラムの場合、以下の -qlanglvl サブオプションを suboption に使用できます。


classic 非 stdc89 プログラムのコンパイルを許可し、K&R レベルのプリプロセッサーに厳密に適合させます。
extended RT コンパイラーおよび classic との互換性を提供します。この言語レベルは C89 に基づいています。
saa 現行の SAA(R) C CPI 言語定義に適合するコンパイル。これは現在、SAA C レベル 2 です。
saal2 コンパイルは、SAA C レベル 2 CPI 言語定義に準拠します。ただし、いくつかの例外があります。
stdc89 ANSI C89 標準に適合するコンパイルで、ISO C90 としても知られています。
stdc99 ISO C99 標準に適合するコンパイル。
extc89 コンパイルは、ANSI C89 標準に適合しており、インプリメンテーション固有の言語拡張を受け入れます。
extc99 コンパイルは、ISO C99 標準に適合しており、インプリメンテーション固有の言語拡張を受け入れます。
[no]ucs 言語レベル stdc99 および extc99 では、デフォルトは -qlanglvl=ucs です。

このオプションは、ユニコード文字が、プログラム・ソース・コードの ID、ストリング・リテラル、および文字リテラルで許可されるかどうかを制御します。

ユニコード文字セットは、C 標準でサポートされています。この文字セットには、北アメリカおよび西欧のすべての言語を含む、幅広い範囲の言語で使用される文字の全セット、数字、およびその他の文字が含まれています。ユニコード文字は、16 ビットまたは 32 ビットが可能です。 ASCII の 1 バイト文字は、ユニコード文字セットのサブセットです。

このオプションが、yes に設定されている場合は、ソース・ファイルに直接か、またはエスケープ・シーケンスに類似した表記を使用して、ユニコード文字を挿入することができます。ユニコード文字の多くが、画面に表示できない、またはキーボードから入力できないため、通常は、後者の方法が好まれています。ユニコード文字の表記形式は、16 ビット文字の場合は ¥uhhhh、32 ビット文字の場合は ¥Uhhhhhhhh です。ここで、h は、16 進数字を表します。文字の短縮 ID は、ISO/IEC 10646 によって指定されます。

以下の -qlanglvl サブオプションは、C コンパイラーによって受け入れられますが、無視されます。これらのサブオプションが暗黙指定する関数を使用可能にするには、-qlanglvl=extended-qlanglvl=extc99、または -qlanglvl=extc89 を使用してください。 -qlanglvl に他の値を指定すると、これらのサブオプションによって暗黙指定される関数は使用不可になります。


[no]gnu_assert GNU C 移植性オプション。
[no]gnu_explicitregvar GNU C 移植性オプション。
[no]gnu_include_next GNU C 移植性オプション。
[no]gnu_locallabel GNU C 移植性オプション。
[no]gnu_warning GNU C 移植性オプション。

C++ に適用 C++ プログラムでは、以下の 1 つ以上の -qlanglvl サブオプションを suboption に指定できます。


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 を設定します。

 

classic によって示される stdc89 モードに対する例外は以下のとおりです。

トークン化 マクロ展開により導入されるトークンは、場合によっては隣接するトークンと結合されることがあります。これは、従来は、旧式のプリプロセッサーのテキスト・ベースのインプリメンテーションで意図的に行われていました。これは、従来のインプリメンテーションでは、プリプロセッサーが別個のプログラムであり、その出力がコンパイラーに渡されていたためです。

同様の理由から、コメントによってのみ分けられたトークンが、 1 つのトークンを形成するように結合されることもあります。ここでは、 classic モードでコンパイルされたプログラムのトークンを行う方法の要約を示します。

  1. ソース・ファイルの該当ポイントで、次のトークンが、トークンを形成することのできる可能性のある文字の最長シーケンスです。例えば、 i ++ + ++ j は正しいプログラムになりますが、 i+++++ji ++ ++ + j としてトークン化されます。
  2. 形成されたトークンが ID およびマクロ名である場合は、そのマクロは、その #define ディレクティブで指定されたトークンのテキストで置き換えられます。各パラメーターは、対応する引き数のテキストで置き換えられます。コメントは、引き数とマクロ・テキストの両方から取り除かれます。
  3. スキャンは、元のプログラムの一部であるかのように、マクロが置き換えられたポイントの最初のステップから再開されます。
  4. プログラム全体のプリプロセスが終わると、その結果は、最初のステップのようにコンパイラーによって再度スキャンされます。置き換えを行うマクロがないため、2 番目と 3 番目のステップはここでは適用されません。プリプロセス・ディレクティブに似ている最初の 3 ステップによって生成される構成体は、そのようには処理されません。

新しいトークンを形成するため、隣接しているものの事前に分けられているトークンのテキストを結合するのは、 3 番目および 4 番目のステップで行います。

行継続用の ¥ 文字は、ストリング、文字リテラル、およびプリプロセス・ディレクティブでしか受け入れられません。

以下の構成体があるとします。

#if 0
  "unterminated
#endif
#define US "Unterminating string
char *s = US terminated now"

上記の構成体は、先頭が FALSE ブロック内の終了しないリテラルで、2 番目がマクロ展開後に完了するため、診断メッセージを生成しません。しかし、

char *s = US;

このとおり指定すると、US 内のストリング・リテラルが行の終わりまでに完了しないため、診断メッセージが生成されます。

空の文字リテラルは使用できます。このリテラルの値はゼロです。

プリプロセス・ディレクティブ 行の先頭列に、# トークンがなければなりません。# の直後に続くトークンは、マクロ展開に使用できます。ディレクティブの名前、および以下の例の ( の場合にのみ、¥ を使って行を継続することができます。
#define f(a,b) a+b
f¥
(1,2)      /* accepted */

#define f(a,b) a+b
f(¥
1,2)       /* not accepted */

¥ に関する規則は、ディレクティブが有効であるかどうかに適用されます。例を以下に示します。

#¥
define M 1   /* not allowed */

#def¥
ine M 1      /* not allowed */

#define¥
M 1          /* allowed */

#dfine¥
M 1          /* equivalent to #dfine M 1, even
                   though #dfine is not valid  */

以下に、classic モードと stdc89 モードの間の、プリプロセッサー・ディレクティブの相違点を示します。ここにリストしていないディレクティブは、どちらのモードでも同じように振る舞います。

#ifdef/#ifndef
最初のトークンが ID でないと、診断メッセージは生成されず、条件は FALSE です。

#else
余計なトークンがあると、診断メッセージは生成されません。

#endif
余計なトークンがあると、診断メッセージは生成されません。

#include
< と > は別のトークンです。ヘッダーは、< と > のつづりと、これらの間のトークンを結合することにより、形成されます。そのため、/* と // はコメントとして認識されて (常に除去され)、" および ' が < および > 内のリテラルを開始します。 (C プログラムでは、-qcpluscmt を指定すると、 C++ 形式のコメント // が認識されます。)

#line
行番号の一部ではないトークンすべてのつづりは、新しいファイル名を形成します。これらのトークンは、ストリング・リテラルである必要はありません。

#error
classic モードでは認識されません。

#define
有効なマクロ・パラメーター・リストは、ID なしで構成されるか、またはコンマで区切られた任意の数の ID で構成されます。コンマは無視され、パラメーター・リストは、コンマが指定されていないかのように構成されます。パラメーター名を固有にする必要はありません。競合する場合は、最後に指定された名前が認識されます。

無効パラメーター・リストの場合、警告が発行されます。マクロ名を新しい定義で再定義すると、警告が発行され、その新しい定義が使用されます。

#undef
余計なトークンがあると、診断メッセージは生成されません。
マクロ展開
  • マクロ起動に関する引き数の数がパラメーターの数に一致しないと、警告が発行されます。
  • 関数類似マクロのマクロ名の後に (トークンがある場合、これは引き数が少なすぎる (上記と同様)) として処理され、警告が発行されます。
  • パラメーターは、ストリング・リテラルと文字リテラルで置き換えられます。
  • 例:
    #define M()    1
    #define N(a)   (a)
    #define O(a,b) ((a) + (b))
    
    M();  /* no error */
    N();  /* empty argument */
    O();  /* empty first argument
                and too few arguments */
    
テキスト出力 コメントの置き換え用に生成されるテキストはありません。

関連参照

IBM Copyright 2003