2010-08-18 3 views

ответ

7

Как и большинство (все, может быть) компиляторы, размер перечисляемого типа может варьироваться. Вот пример программы и ее выход:

#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 

Все, что стандарт требует является:

Выбор типа определяется реализацией, но должен быть способен представления значений всех членов перечисления.

Быстрый поиск в Интернете не включал руководство по clang, которое указывало на его поведение, но почти наверняка где-то там.

1

Ну, компилятор может выбрать целочисленный размер, достаточно большой, но я предполагаю, что он выберет «собственный» размер («слово» = размер регистра, должен быть длинным для 32-разрядного режима x86 или долгого времени для x64). Для вашей частной структуры вам все равно, но если вы хотите сериализовать ее в файл или через сеть, вы должны явно использовать целочисленный тип, достаточно большой (например, длинный), чтобы вы могли его забрать с другим компилятором/языком без головных болей.

Если вы действительно хотите знать, просто попросить компилятор:

printf("%d\n", sizeof(enum myEnumType)); 
2

В дополнение к ответу Карла он может быть даже совместим с подписанным или неподписанным типом, если что-либо из этого подходит лучше. Например его мог, но не должен в

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

имеют small в signed char и big в unsigned char.

BTW константы m, a и b не перечислимого типа, но всегда типа int.

Редактировать: Я только что испытал с значениями, превышающими int. В режиме C99 gcc испускает ошибку (это правильно), но clang только выдает предупреждение и имеет более широкий тип для представления enum.

 Смежные вопросы

  • Нет связанных вопросов^_^