この付録では、IBM C 拡張機能をカテゴリーに分けて表します。大きなカテゴリーの分類基準は 、拡張機能がベース言語に対して直交であるか、または非直交であるかです。 直交の拡張機能は、ベース言語を妨害しません。直交の拡張機能は、extended、extc89、 または extc99 のいずれか 1 つの拡張モードでコンパイルすると、まとめて使用可能になります。 extended モードは、C89 に基づいています。
これに対し、非直交の拡張機能は、ベース言語フィーチャーの構文またはセマンティクスを変更する可能性があります。したがって、ベース言語に対して非直交 であるか、または GNU C インプリメンテーションと競合するような IBM C 拡張機能は、それぞれ明示的に指定する必要があります。
肯定および否定の langlvl サブオプションの構文は、以下のとおりです。
-qlanglvl=lang_suboption -qlanglvl=nolang_suboption
オプションおよびサブオプションでは、大文字と小文字は区別されません。
直交の IBM C 拡張機能は、以前のリリースの個々のオプション・コントロールが備わった 言語フィーチャー、C99 フィーチャーとしての拡張機能、および GNU C に関連する 拡張機能という、3 つのサブグループに分類されます。
C89 に対して直交である既存の言語フィーチャーの中には、 肯定および否定の各のオプション・コントロールが備わっているものもあります。 下位互換性を保つために、これらのコンパイラー・オプションおよびサブオプションのサポートは保持する必要があります。 フィーチャーを重複して使用可能にしても、その使用可能状態は変更されません。
個々のオプション・コントロールが備わった IBM C 言語拡張機能 | ||
言語拡張機能 | コンパイラー・オプション | 注釈 |
---|---|---|
ID 中のドル記号 | -qdollar | すべてのレベルで受け入れられます。 |
UCS | -qlanglvl=ucs | 否定の設定である -qlanglvl=noucs は STDC99 により無視され、通知メッセージが出されます。 |
二重字表記文字 | -qdigraph | 否定の設定である -qnodigraph は STDC99 により無視され、通知メッセージが出されます。 |
C99 に関連する言語フィーチャーのほとんどは、C89 に対して直交です。ただし、restrict キーワードは例外であり、ユーザーの可変ネーム・スペースを侵害します。-qkeyword=restrict オプションを使用することにより、明示的にサポートを要求することができます。
C89 の拡張機能としての C99 フィーチャー | |
言語フィーチャー | 注釈 |
---|---|
restrict 型修飾子 | 制限付きポインターを定義します。 |
可変長配列 | -qlanglvl=c99vla |
フレキシブルな配列メンバー | C99 では、フレキシブルな配列メンバーが構造体の末尾にのみ許可されています。GNU C では、これは構造体のいずれの場所にも許可されます。 |
複素数データ型のサポート |
|
long long int 型 |
|
16 進浮動小数点定数のサポート |
|
暗黙の int の除去 |
|
整数除法の詳細な定義 | ゼロに切り捨て。 |
汎用文字名 |
|
拡張 ID | 内部名および外部名に対する制限が除去されました。 |
複合リテラル |
|
指定の初期化指定子 |
|
C++ 形式のコメント |
|
暗黙の関数宣言の除去 |
|
intmax_t/uintmax_t で実行されるプリプロセッサー演算 |
|
混合宣言とコード |
|
選択および繰り返しステートメントに対する新規のブロック・スコープ |
|
整数定数型ルール | long long int 型に対応するため。 |
整数プロモーション・ルール | long long int 型に対応するため。 |
vararg マクロ | 可変引き数を持つ、関数に似たマクロ。 |
enum 宣言内での末尾のコンマの許可 |
|
_Bool 型の定義 |
|
べき等の型修飾子 | 「重複する型修飾子」とも呼ばれます。 |
空のマクロ引き数 |
|
追加の事前定義マクロ名 |
|
_Pragma プリプロセス演算子 |
|
標準プラグマ | #pragma STDC FP_CONTRACT#pragma STDC FENV_ACCESS#pragma STDC CX_LIMITED_RANGE |
__func__ 事前定義 ID |
|
UTF-16、UTF-32 リテラル |
|
IBM C コンパイラーは、GNU C 言語拡張機能の以下のサブセットを認識します。
以下のテーブルに使用されている説明ラベルは、GNU C
のドキュメンテーションで使用されているラベルと類似しています。
GNU C に関連する IBM C 拡張機能 | |
言語フィーチャー | 注釈 |
---|---|
式の中のステートメントおよび宣言 |
|
ローカルに宣言されたラベル |
|
値としてのラベル | 計算済み goto 文を含みます |
ネストされた関数 |
|
typeof を持つ型の参照 | 代替スペルの __typeof__ が推奨されます。 |
一般化された左辺値 |
|
ダブルワードの整数 |
|
GNU C 複素数型 |
|
GNU C 16 進浮動小数点定数 |
|
長さゼロの配列 |
|
可変長の配列 |
|
引き数の変数番号を含むマクロ | __VA_ARGS__ の代わりに ID を使用します。 |
左辺値でない配列が添え字を持つことができる |
|
定数でない初期化指定子 |
|
複合リテラル |
|
共用体型へのキャスト | C のみ |
関数の属性の宣言 |
|
非プロトタイプ定義をオーバーライドする関数プロトタイプ |
|
位置合わせについて問い合わせるための __alignof__ |
|
変数の属性の指定 |
|
型の属性の指定 |
|
C 式のオペランドを含むアセンブラー命令 |
|
指定レジスター内の変数 | コンパイラーは GNU 構文は受け入れますが、セマンティクスは無視します。 |
代替キーワード |
|
#warning |
|
#include_next |
|
非直交の IBM C 拡張機能は、以前のリリースの言語フィーチャー、C99 フィーチャーとしての 拡張機能、および GNU C に関連する拡張機能という、3 つのサブグループに分類されます。
厳密には、IBM C 言語フィーチャーの upconv は非直交として分類されます。
ただし、これは extended 言語レベルの一部として自動的に使用可能になります。
これが、extended と extc89 の大きな違いです。
非直交の IBM C 言語拡張機能 | ||
言語拡張機能 | コンパイラー・オプション | 注釈 |
---|---|---|
long long リテラル | -qlonglit | stdc99 により無視され、警告が出されます。 |
upconv | -qupconv | デフォルトでは -qlanglvl=extended 言語レベルで使用可能です。 |
非直交の IBM C 言語拡張機能 | |
言語拡張機能 | 注釈 |
---|---|
inline キーワード | C89 および GNU C に対して非直交です。 |
フレキシブルな配列メンバー | C99 では、フレキシブルな配列メンバーが構造体の末尾にのみ許可されています。GNU C では、これは構造体のいずれの場所にも許可されます。 |
非直交の GNU C 拡張機能 | |
言語拡張機能 | コンパイラー・サブオプションおよび注釈 |
---|---|
引き数の変数番号を含むマクロ | 変数引き数が指定されていない場合、末尾のコンマを除去します。 |
AltiVec Vector プログラミングの IBM C 拡張機能 | |
言語拡張機能 | コンパイラー・サブオプションおよび注釈 |
---|---|
Vector プログラミング言語拡張機能 | -qaltivec
AltiVec プログラミング・モデルをサポートするためのキーワード、マクロ、およびプラグマ。 |