5.59 C99 の新しい言語機能

1999 C99 標準では、新しい言語機能が導入されました。

新機能には次のものがあります。
  • 使用する引数の数が可変のマクロなど、GNU コンパイラで提供される C90 の拡張機能と同様な一部の機能

    GNU コンパイラにおける C90 の拡張の実装は、C99 における同様な機能の実装とは必ずしも対応しません。
  • // コメント、および宣言とステートメントを混合する機能など、C++ で使用可能な一部の機能
  • 複素数、制限付きポインタ、指定済みのイニシャライザなど、まったく新しい一部の機能
  • 新しいキーワードおよび識別子
  • 既存の C90 言語の拡張構文
以下のセクションでは、C99 を初めて使用する開発者に役立つ C99 の新しい機能を選択して説明します。

特殊なケースを除き、標準で指定された言語が C++ のサブセットであるという意味で、C90 には標準 C++ との互換性があります。この意味で、C99 標準の新しい機能は、C99 と C++ との互換性がなくなったことを意味します。
C90 標準で指定された言語が C++ のサブセットでない特別なケースの例として、// コメントのサポートや、typedef および構造体タグ名前空間のマージがあります。たとえば、C90 の場合、次のコードは /* hello world */ が削除されるため、x = a / b - c; に拡張されます。しかし、C++ および C99 の場合は、// から 1 行目の終わりまでのすべてが削除されるため、x = a - c; に拡張されます。
x = a //* hello world */ b 
    - c;
以下のコードは、マージされた名前空間を原因として C(90 および 99)と C++ の間での typedef および構造体タグの処理方法が異なることを示しています。
typedef int a;
{
  struct a { int x, y; };
  printf("%d\n", sizeof(a));
}
C 90 および C99 の場合、このコードは別個の名前の 2 つの型を定義します。つまり、aint の typedef であり、struct a は 2 つの整数データ型を含む構造体型です。sizeof(a)sizeof(int) と評価されます。
C++ の場合、構造体型はタグのみを使用してアドレス指定できます。つまり、struct a の定義が有効範囲内に含まれている場合、単独で使用されている名前 a は、typedef ではなく構造体型を参照するため、 C++ の sizeof(a)sizeof(int) より大きくなります。
関連する概念
5.61 C99 および C90 の // コメント
5.62 C99 の複合リテラル
5.63 C99 の指定済みのイニシャライザ
5.64 C99 の 16 進浮動小数点数
5.65 C99 のフレキシブル配列メンバ
5.66 C99 の __func__ 定義済み識別子
5.67 C99 の inline 関数
5.68 C99 および C90 の long long データ型
5.69 C99 の使用する引数の数が一定でないマクロ
5.70 C99 の宣言とステートメントの混合
5.71 C99 の選択および反復ステートメントの新しいブロック有効範囲
5.72 C99 の _Pragma 処理命令
5.73 C99 の制限付きポインタ
5.75 C99 の複素数
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.