9.44 構造体、共用体、列挙型、ビットフィールドの拡張機能

以下の構造体、共用体、列挙型、ビットフィールドの拡張機能がサポートされています。

  • C では、ファイル有効範囲配列の要素の型は、 不完全な struct 型または union 型にできます。要素の型は、たとえば配列に付加される添字がある場合など、そのサイズが必要とされる前に完全になっている必要があります。配列が extern 型でない場合、要素の型はコンパイルが終了するまでに完全になっている必要があります。
  • struct 指定子または union 指定子の閉じ中括弧(})の前にある最後のセミコロンは省略できます。この場合は警告が生成されます。
  • 値が 1 つで、スタティック配列の 構造体 または 共用体 全体の初期化に使用するイニシャライザの式を中括弧で囲む必要はありません。ISO C では中括弧の使用が規定されています。
  • 以下を含め、C++ 匿名の共用体に似た構造体を使用できるようにするための拡張機能がサポートされています。
    • 匿名の共用体だけでなく、匿名の構造体も使用できます。匿名構造体のメンバは、それを保持する 構造体 の有効範囲に関連付けられ、通常のメンバと同じようにルックアップされます。
    • 匿名構造体のメンバは、 typedef の名前によって、 それを保持する 構造体 に導入できます。つまり、実際の匿名の共用体のようにメンバを直接宣言する必要はありません。
    • タグは、C モードの場合にのみ宣言できます。
    匿名の構造体と匿名の共用体をサポートするには、 anon_unions プラグマを使用する必要があります。
  • enum リストの終わりには 1 つ余分なコンマを追加できますが、その場合には注釈が生成されます。
  • enum タグは不完全でも構いません。タグの名前は、中括弧で囲まれたリストを指定することによって、後で定義して解決できます。
  • 列挙定数の値は、 int の範囲内ではなく、 unsigned int の範囲内に収まる符号なしの値を求める式によって指定できます。以下に例を示します。
    /* When ints are 32 bits: */
    enum a { w = -2147483648 };  /* No error */
    enum b { x = 0x80000000 };   /* No error */
    enum c { y = 0x80000001 };   /* No error */
    enum d { z = 2147483649 };   /* Error */
    
  • C では、オーバーサイズのビットフィールドがサポートされます。オーバーサイズのビットフィールドは、標準 C++ の一部です。ARM C でのオーバーサイズのビットフィールドのセマンティクスは、標準 C++ と同じです。
    オーバーサイズのビットフィールドは、 basetype v:N または basetype:N という形をした構造体内のフィールドの一種です。ここで、 basetype のサイズ(ビット数単位)は、 N より小さい値です。例えば、char a:16で、型 char は 8 ビットなのに対して、ビットフィールドは 16 ビットです。余計なビットは、パディングとして扱われます。
  • ビットフィールドには、 int および unsigned int 型のほかに、 enum 型または整数型の基本型を割り当てることができます。
関連する概念
5.59 C99 の新しい言語機能
関連する参考文書
10.76 プラグマ
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.