Qual é o tamanho de um enum em C?

Estou criando um conjunto de valores de enum, mas preciso que cada valor de enum tenha 64 bits de largura. Se bem me lembro, um enum geralmente é do mesmo tamanho que um int; mas eu achei que li em algum lugar que (pelo menos no GCC) o compilador pode fazer o enum de qualquer largura que eles precisam ser para manter seus valores. Então, é possível ter um enum que tenha 64 bits de largura?

Um enum só é garantido para ser grande o suficiente para manter valores int . O compilador é livre para escolher o tipo real usado com base nas constantes de enumeração definidas para que ele possa escolher um tipo menor se puder representar os valores definidos. Se você precisar de constantes de enumeração que não se encheckboxm em um int você precisará usar extensões específicas do compilador para fazer isso.

Extraído do atual Padrão C (C99): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.7.2.2 Especificadores de enumeração
[…]
Restrições
A expressão que define o valor de uma constante de enumeração deve ser uma expressão constante inteira que tenha um valor representável como um int.
[…]
Cada tipo enumerado deve ser compatível com char, um tipo inteiro assinado ou um tipo inteiro sem sinal. A escolha do tipo é definida pela implementação, mas deve ser capaz de representar os valores de todos os membros da enumeração.

Não que os compiladores sejam bons em seguir o padrão, mas essencialmente: se o seu enum tem alguma coisa além de um int, você está em um “profundo comportamento sem suporte que pode voltar a mordê-lo em um ou dois anos”.

Embora as respostas anteriores estejam corretas, alguns compiladores têm opções para quebrar o padrão e usam o menor tipo que conterá todos os valores.

Exemplo com o GCC :

 enum ord __attribute__ ((__packed__)) { FIRST = 1, SECOND, THIRD, }; STATIC_ASSERT( sizeof(enum ord) == 1 ) 

Na linguagem C, um enum é garantido para ser do tamanho do int. Existe uma opção de tempo de compilation ( -fshort-enums ) para torná-lo tão curto (Isso é útil principalmente no caso de os valores não serem maiores que 64K). Não há opção de tempo de compilation para aumentar seu tamanho para 64 bits.

O tamanho do armazenamento não é influenciado pela quantidade dos valores na enumeração. O tamanho do armazenamento é definido pela implementação, mas a maior parte é o tamanho de sizeof(int) .

Não temos controle sobre o tamanho de uma variável enum. Depende totalmente da implementação, e o compilador dá a opção de armazenar um nome para um inteiro usando enum, então enum está seguindo o tamanho de um inteiro.

Considerar:

 enum value{a,b,c,d,e,f,g,h,i,j,l,m,n}; value s; cout << sizeof(s) << endl; 

Isso dará a saída como 4. Portanto, não importa o número de elementos que um enum contém, seu tamanho é sempre fixo.