Estou criando um conjunto de valores de enumeração, mas preciso que cada valor de enumeração tenha 64 bits de largura. Se bem me lembro, um enum geralmente é do mesmo tamanho que um int; mas achei que tinha lido em algum lugar que (pelo menos no GCC) o compilador pode fazer com que o enum tenha a largura necessária para manter seus valores. Então, é possível ter um enum com 64 bits de largura?
140
Respostas:
Um
enum
só é garantido para ser grande o suficiente para armazenarint
valores. 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 que você definir. Se você precisar de constantes de enumeração que não se encaixam em umaint
, precisará usar extensões específicas do compilador para fazer isso.fonte
enum
deve ser maior que umint
ou menor? Após a resposta de @MichaelStum, sua primeira frase deve ser "Éenum
garantido que apenas um se encaixa em umint
valor".int
. A resposta de Michael Stum , que faz referência a C99, diz que um enum pode ser tão pequeno quanto umchar
.enum
só é garantido para ser grande o suficiente para manter o valor da maior recenseador na enumeração.Retirado do atual C Standard (C99): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
Não que os compiladores sejam bons em seguir o padrão, mas essencialmente: Se o seu enum tiver algo além de um int, você estará em um "comportamento não suportado profundo que pode voltar a morder você em um ano ou dois".
fonte
int
.short
e tambémlong
são tipos inteiros e, independentemente da escolha da implementação, todos os valores devem se ajustar (" deve ser capaz de representar os valores de todos os membros da enumeração").int
, a variável de enumeração real pode ser outro tipo. Essa é uma inconsistência bem conhecida no padrão.enum my_enum { my_value }
,my_value
terá tipoint
, masenum my_enum
pode ter um tipo definido de implementação que deve representar pelo menos todos os valores de enumeração. Portanto,my_value
pode haver uma conversão restrita paraenum my_enum
, mas é garantido que não será excedido.Enquanto as respostas anteriores estão corretas, alguns compiladores têm opções para quebrar o padrão e usar o menor tipo que conterá todos os valores.
Exemplo com o GCC (documentação no manual do GCC ):
fonte
Basta definir o último valor da enumeração para um valor grande o suficiente para torná-lo o tamanho que você deseja que a enumeração seja, então deve ser desse tamanho:
fonte
Não temos controle sobre o tamanho de uma
enum
variável. Depende totalmente da implementação, e o compilador oferece a opção de armazenar um nome para um número inteiro usandoenum
, assimenum
como o tamanho de um número inteiro.fonte
Na linguagem C, um
enum
é garantido para ter o tamanho de umint
. Há uma opção de tempo de compilação (-fshort-enums
) para torná-la tão curta (Isso é útil principalmente se os valores não ultrapassarem 64K). Não há opção de tempo de compilação para aumentar seu tamanho para 64 bits.fonte
Considere este código:
Dará 4 como saída. Portanto, não importa o número de elementos que um
enum
contenha, seu tamanho é sempre fixo.fonte