Что такое тип данных C enum компилятора Clang? - PullRequest
5 голосов
/ 18 августа 2010

Я отправил другой вопрос: Какой тип я должен использовать для двоичного представления перечисления C? , и для ответа я должен знать тип данных enum моего компилятора.

Что такоетип данных C enum на компиляторе Clang?

Ответы [ 3 ]

8 голосов
/ 18 августа 2010

Как и большинство (все, может быть) компиляторов 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

Все, что требует стандарт, это:

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

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

2 голосов
/ 18 августа 2010

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

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.

1 голос
/ 18 августа 2010

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

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

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