-qlanglvl

説明

コンパイルのための言語レベルと言語オプションを選択する。

構文

構文図を読む構文図をスキップする                    .-:---------.
                    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)

プラグマ・・ディレクティブは、ソース・コードのコメント以外のどの行よりも前に指定する必要があります。

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++ が無名の共用体以外で許可するすべての型のメンバーを持つことができます。 例えば、構造体、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 を設定します。

 

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"

これは、1 番目が 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
有効なマクロ・パラメーター・リストは、コンマで区切られた 0 以上の 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 */
テキスト出力 コメントの置き換え用に生成されるテキストはありません。

関連情報