他の質問を投稿しました: C 列挙型のバイナリ表現にはどの型を使用すればよいですか? 、そして答えによって、コンパイラの列挙型データ型を知る必要があります。
ClangコンパイラのC enumのデータ型は何ですか?
他の質問を投稿しました: C 列挙型のバイナリ表現にはどの型を使用すればよいですか? 、そして答えによって、コンパイラの列挙型データ型を知る必要があります。
ClangコンパイラのC enumのデータ型は何ですか?
ほとんどの (おそらくすべての) 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 の動作を指定したマニュアルは見つかりませんでしたが、ほぼ確実にどこかにあります。
カールの答えに加えて、それがより適切なものであれば、符号付きまたは符号なしの型と互換性があるかもしれません。たとえば、できたが入れてはいけない
enum small { m = -1; a = 127; };
enum big { b = 255; };
とsmall
にsigned char
ありbig
ますunsigned char
。
ところで、定数は列挙型m
ではなく、常に型a
です。b
int
編集:私はちょうどより大きい値でテストしましたint
。C99モードgcc
では、エラー(これは正しい)をclang
発行しますが、警告を発行するだけであり、より広いタイプでを表しますenum
。
まあ、コンパイラは十分に大きな整数サイズを選択するかもしれませんが、「ネイティブ」サイズを選択すると思います(「ワード」=レジスタのサイズ、x86 32ビットモードの場合はロング、x64の場合はロングロングにする必要があります)。プライベートな構造体については気にする必要はありませんが、それをファイルまたはネットワーク経由でシリアル化したい場合は、別のコンパイラ/言語で拾うことができるように、十分な大きさ (例: long) の整数型を明示的に使用する必要があります。頭痛なし。
本当に知りたい場合は、コンパイラに尋ねてください。
printf("%d\n", sizeof(enum myEnumType));