C99 の新しい言語機能

1999 C99 標準では、以下のような新しい言語機能が導入されました。

以下のセクションでは、C99 を初めて使用する開発者に役立つ C99 の新しい機能を選択して説明します。

Note

特殊なケースを除き、標準で指定された言語が C++ のサブセットであるという意味で、C90 には標準 C++ との互換性があります。この意味で、C99 標準の新しい機能は、C99 と C++ との互換性がなくなったことを意味します。

C90 標準で指定された言語が C++ のサブセットでない特別なケースの例として、// コメントのサポートや、typedef および構造体タグ名前空間のマージがあります。たとえば、C90 の場合、次のコードは /* hello world */ が削除されるため、x = a / b - c; に拡張されます。しかし、C++ および C99 の場合は、// から行の終わりまでのすべてが削除されるため、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) より大きくなります。

Show/hide関連項目

Copyright © 2010 ARM. All rights reserved.ARM DUI 0472BJ
Non-ConfidentialID011811