7

要素の数に応じて配列を割り当てる必要がありenumます。私は次のことをしました:

enum { A, B, C, LAST };
char buf[LAST];

-ansi -pedanticフラグがあっても問題なく動作します。しかし、それがGCCまたはclang(すべてではないにしてもほとんどのGCC拡張をサポートする)拡張であるか、またはANSI C標準で実際に許可されており、ANSI-C stdを使用するCコンパイラで正常に動作するかどうかはわかりません。誰かがそれを明確にすることができますか?

4

5 に答える 5

7

C89 (セクション 3.5.2.2) と C99 (セクション 6.7.2.2) の両方の標準は、列挙型を同じ方法で定義します。

6.7.2.2 列挙指定子(パラグラフ 3)、http: //www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

3.5.2.2 列挙指定子(パラグラフ 3)、http://flash-gordon.me.uk/ansi.c.txt

両方とも読む:

[...] = を持つ列挙子は、その列挙定数を定数式の値として定義します。最初の列挙子に = がない場合、その列挙定数の値は 0 です。 = のない後続の各列挙子は、その列挙定数を、前の列挙定数の値に 1 を加算することによって得られる定数式の値として定義します。[...]

したがって、構文では、標準に準拠したコンパイラはコードを正しく実行します。

于 2012-12-07T20:21:31.627 に答える
4

他の人が言ったように、それは有効です。しかし、これまでのところ、適切なセクションを引用した人は誰もいないと思います。N1256 C99 ドラフトの関連するものは次のとおりです。 6.6「定数式」パラグラフ 6:

整数定数式99) は整数型を持ち、整数定数、列挙定数であるオペランドのみを持ちます [...]

そして、6.7.5.2「配列宣言子」パラグラフ4:

サイズが整数定数式で、要素の型に既知の定数サイズがある場合、配列型は可変長配列型ではありません [...]

だから基本的に:

  • 列挙定数は定数式です
  • 配列が可変長にならないようにするには、定数式が必要です

他の人が引用した6.7.2.2「列挙指定子」はenum、列挙子を使用するのではなく、を宣言することについて話していると思います。もちろん、それらを宣言するときはコンパイル時定数が必要なので、式で使用する場合もコンパイル時定数にする必要があります。

于 2015-05-18T20:36:36.400 に答える
3

-ansi -pedantic フラグを付けても問題なく動作します

したがって、GNU 拡張機能ではありません。はい、これは ANSI C では問題ありません。an のメンバーenumは定数式だからです。

于 2012-12-07T20:17:25.663 に答える
2

誰かがそれを明確にすることができますか?

ご存知だと思いますが、列挙型は数値にラベルを適用するだけです。

enum
{ A,  // 0 
  B,  // 1
  C,  // 2
  LAST  // 3
};

本当に:

char buf[LAST];

以下と違いはありません:

char buf[3];
于 2012-12-07T20:20:47.217 に答える
1

C標準、パラグラフ6.2.5(タイプ)から:

16 列挙は、一連の名前付き整数定数値で構成されます。それぞれの個別の列挙は、異なる列挙型を構成します。

17 char 型、符号付きおよび符号なし整数型、列挙型をまとめて整数型と呼びます。

また、パラグラフ 6.7.2.2 (列挙指定子):

列挙定数の値を定義する式は、int として表現可能な値を持つ整数定数式でなければなりません。

于 2012-12-07T20:20:38.637 に答える