IBM C++ は C のスーパーセットとしての互換性を保つため、C99 言語レベルでの互換性および GNU C 言語拡張機能との互換性を実現するフィーチャーをインプリメントしています。 また、IBM C++ は、C++ の GNU 拡張機能のサブセットをサポートしています。 IBM C 言語拡張機能と同様に、C++ 拡張機能も、直交と非直交の両方の言語フィーチャーを持っています。 直交拡張機能 とは、既存の言語フィーチャーの振る舞い を変更することなく、ベース部分の上に 追加されるフィーチャーのことです。非直交拡張機能 とは、 既存構成のセマンティクスを変更したり、ベースと競合する構文を導入した りすることができる拡張機能のことです。
この付録では、IBM C++ 言語拡張機能をカテゴリーに分けて表します。 個々の言語フィーチャーを使用可能および使用不可化にするためのコンパイラー・オプション構文は、IBM C の構文と 同じです。extended モードでコンパイルすると、Standard C++ または C++98 に対して直交の言語拡張機能はすべて使用可能になります。 特定のフィーチャーを重複して使用可能化しても、その使用可能状態は変更されません。
コンパイラー・オプションについての詳細は、「XL C/C++ コンパイラー・リファレンス」に記載されています。
直交の IBM C++ 拡張機能は、C との互換性を維持するための C99 フィーチャーに関連する 拡張機能、GNU C に関連する拡張機能、および GNU C++ に関連する拡張機能という、3 つの サブグループに分類されます。
IBM C++ では、以下の C99 言語フィーチャーが追加されています。
C99 言語レベルでの IBM C との互換性のための IBM C++ 拡張機能 | |
言語フィーチャー | 注釈 |
---|---|
restrict 型修飾子 | 制限付きポインターまたは参照を定義します。 |
可変長配列 |
|
フレキシブルな配列メンバー | C99 では、フレキシブルな配列メンバーが構造体の末尾にのみ許可されています。GNU C では、これは構造体のいずれの場所にも許可されます。 |
複素数データ型のサポート |
|
16 進浮動小数点定数のサポート |
|
汎用文字名 | C++ のコード・ポイント範囲が拡張され、C99 のコード・ポイント範囲と一致するようになりました。 |
複合リテラル |
|
vararg マクロ | 可変引き数を持つ、関数に似たマクロ。 |
enum 宣言内での末尾のコンマの許可 |
|
空のマクロ引き数 |
|
追加の事前定義マクロ名 |
|
_Pragma プリプロセス演算子 |
|
__func__ 事前定義 ID |
|
UTF-16、UTF-32 リテラル |
|
GNU C に関連する直交の IBM C++ 言語拡張機能 | ||
言語拡張機能 | コンパイラー・オプションおよび注釈 | |
---|---|---|
式の中のステートメントおよび宣言 | -qlanglvl=extended | |
ローカルに宣言されたラベル | -qlanglvl=gnu_locallabel | |
値としてのラベル | -qlanglvl=gnu_labelvalue | |
計算済み goto | -qlanglvl=gnu_computedgoto | |
typeof を持つ型の参照 | -qkeyword=__typeof__ | |
GNU C 複素数型 | -qlanglvl=c99complex、-qlanglvl=gnu_complex | |
GNU C 16 進浮動小数点定数 | -qlanglvl=c99hexfloat | |
長さゼロの配列 | -qlanglvl=compatzea | |
可変長の配列 | -qlanglvl=c99vla | |
引き数の変数番号を含むマクロ | -qlanglvl=varargsmacros, -qlanglvl=gnu_varargmacros | |
__VA_ARGS__ の代わりに ID を使用 | ||
複合リテラル | -qlanglvl=c99compoundliteral | |
関数、変数、および型の属性 | -qkeyword=__attribute__ | |
すべてがキーワード __attribute__ を使用するため、ひとまとめになります。 | ||
位置合わせについて問い合わせるための __alignof__ | -qkeyword=__alignof__ | |
C 式のオペランドを含むアセンブラー命令 | -qasm=gcc、-qkeyword=asm | |
指定レジスター内の変数 | -qlanglvl=gnu_explicitregvar | |
サブオプションを指定した場合、コンパイラーは GNU 構文は受け入れますが、セマンティクスは無視します。 | ||
代替キーワード | -qkeyword=inline -qkeyword=const -qkeyword=volatile -qkeyword=signed | -qkeyword=__alignof__ -qkeyword=__asm__ -qkeyword=__inline__ -qkeyword=__const__ -qkeyword=__extension__ -qkeyword=__restrict__ -qkeyword=__signed__ -qkeyword=__typeof__ -qkeyword=__volatile__ |
これらのオプションは、問題のあるキーワードのために作成されたものです。 | ||
#assert、#unassert、#cpu、#machine、#system | -qlanglvl=gnu_assert | |
すべてアサーションで機能するため、ひとまとめになります。 | ||
#warning | -qlanglvl=gnu_warning | |
#include_next | -qlanglvl=gnu_include_next |
GNU C++ に関連する直交の IBM C++ 言語拡張機能 | |
言語拡張機能 | コンパイラー・オプションおよび注釈 |
---|---|
変数属性 init_priority | -qlanglvl=__attribute__ |
ローカルに宣言されたラベル | ブロック内で宣言される場合にのみサポートされます。 |
非直交の IBM C++ 拡張機能は、C99 フィーチャーに関連する拡張機能および GNU C に関連する 拡張機能という、2 つのサブグループに分類されます。
C99 言語レベルでの IBM C との互換性のための非直交の IBM C++ 拡張機能 | |
言語拡張機能 | 注釈 |
---|---|
inline キーワード | Non-orthogonal to Standard C++、C++98、 C89、および GNU C に対して非直交です。 |
フレキシブルな配列メンバー | C99 では、フレキシブルな配列メンバーが構造体の末尾にのみ許可されています。GNU C では、これは構造体のいずれの場所にも許可されます。 C++ では、ゼロ・エクステント配列を許可することで、部分的なサポートを提供しています。 |
GNU C に関連する非直交の IBM C++ 言語拡張機能 | |
言語拡張機能 | コンパイラー・オプションおよび注釈 |
---|---|
typeof | -qkeyword=typeof |
typeof はユーザーのネーム・スペース下にあるため、非直交です。 | |
引き数の変数番号を含むマクロ | -qlanglvl=varargsmacros |
変数マクロ引き数が指定されていない場合、末尾のコンマを除去します。 |