付録 B. IBM C++ 言語拡張機能

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 つの サブグループに分類されます。

C99 との互換性のための IBM C++ 拡張機能

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++ 拡張機能


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++ 拡張機能


GNU C++ に関連する直交の IBM C++ 言語拡張機能
言語拡張機能 コンパイラー・オプションおよび注釈
変数属性 init_priority -qlanglvl=__attribute__
ローカルに宣言されたラベル ブロック内で宣言される場合にのみサポートされます。

非直交拡張機能

非直交の IBM C++ 拡張機能は、C99 フィーチャーに関連する拡張機能および GNU C に関連する 拡張機能という、2 つのサブグループに分類されます。

C99 との互換性のための IBM C++ 拡張機能


C99 言語レベルでの IBM C との互換性のための非直交の IBM C++ 拡張機能
言語拡張機能 注釈
inline キーワード Non-orthogonal to Standard C++、C++98、 C89、および GNU C に対して非直交です。
フレキシブルな配列メンバー C99 では、フレキシブルな配列メンバーが構造体の末尾にのみ許可されています。GNU C では、これは構造体のいずれの場所にも許可されます。 C++ では、ゼロ・エクステント配列を許可することで、部分的なサポートを提供しています。

GNU C に関連する IBM C++ 拡張機能


GNU C に関連する非直交の IBM C++ 言語拡張機能
言語拡張機能 コンパイラー・オプションおよび注釈
typeof -qkeyword=typeof
typeof はユーザーのネーム・スペース下にあるため、非直交です。
引き数の変数番号を含むマクロ -qlanglvl=varargsmacros
変数マクロ引き数が指定されていない場合、末尾のコンマを除去します。

IBM Copyright 2003