6

他の質問を投稿しました: C 列挙型のバイナリ表現にはどの型を使用すればよいですか? 、そして答えによって、コンパイラの列挙型データ型を知る必要があります。

ClangコンパイラのC enumのデータ型は何ですか?

4

3 に答える 3

9

ほとんどの (おそらくすべての) C コンパイラと同様に、列挙型のサイズはさまざまです。サンプル プログラムとその出力を次に示します。

#include <stdio.h>

typedef enum
{
  val1 = 0x12
} type1;

typedef enum
{
  val2 = 0x123456789
} type2;

int main(int argc, char **argv)
{
  printf("1: %zu\n2: %zu\n", sizeof(type1), sizeof(type2));
  return 0;
}

出力:

1: 4
2: 8

標準が要求するのは次のすべてです。

型の選択は実装定義ですが、列挙のすべてのメンバーの値を表すことができなければなりません。

簡単な Web 検索では、clang の動作を指定したマニュアルは見つかりませんでしたが、ほぼ確実にどこかにあります。

于 2010-08-18T06:56:51.427 に答える
2

カールの答えに加えて、それがより適切なものであれば、符号付きまたは符号なしの型と互換性があるかもしれません。たとえば、できたが入れてはいけない

enum small { m = -1; a = 127; };
enum big { b = 255; };

smallsigned charありbigますunsigned char

ところで、定数は列挙型mではなく、常に型aです。bint

編集:私はちょうどより大きい値でテストしましたint。C99モードgccでは、エラー(これは正しい)をclang発行しますが、警告を発行するだけであり、より広いタイプでを表しますenum

于 2010-08-18T07:04:17.830 に答える
1

まあ、コンパイラは十分に大きな整数サイズを選択するかもしれませんが、「ネイティブ」サイズを選択すると思います(「ワード」=レジスタのサイズ、x86 32ビットモードの場合はロング、x64の場合はロングロングにする必要があります)。プライベートな構造体については気にする必要はありませんが、それをファイルまたはネットワーク経由でシリアル化したい場合は、別のコンパイラ/言語で拾うことができるように、十分な大きさ (例: long) の整数型を明示的に使用する必要があります。頭痛なし。

本当に知りたい場合は、コンパイラに尋ねてください。

printf("%d\n", sizeof(enum myEnumType));
于 2010-08-18T06:56:19.490 に答える