Para VC, aqui está o teste sobre a declaração direta e a especificação do tipo subjacente:
- o seguinte código é compilado ok.
typedef int myint;
enumeração T;
void foo (T * tp)
{
* tp = (T) 0x12345678;
}
enumeração T: char
{
UMA
};
Mas recebi o aviso para / W4 (/ W3 não incorre nesse aviso)
aviso C4480: extensão não padrão usada: especificando o tipo subjacente para a enumeração 'T'
O VC (Microsoft (R) C / C ++ Optimizer Compiler versão 15.00.30729.01 para 80x86) parece com erros no caso acima:
- ao ver enum T; O VC assume que o tipo de enumeração T usa 4 bytes padrão int como tipo subjacente; portanto, o código de montagem gerado é:
? foo @@ YAXPAW4T @@@ Z PROC; foo
; Arquivo e: \ work \ c_cpp \ cpp_snippet.cpp
; Linha 13
push ebp
mov ebp, esp
; Linha 14
mov eax, DWORD PTR _tp $ [ebp]
mov DWORD PTR [eax], 305419896; 12345678H
; Linha 15
pop ebp
ret 0
? foo @@ YAXPAW4T @@@ Z ENDP; foo
O código de montagem acima é extraído diretamente do /Fatest.asm, não do meu palpite pessoal. Você vê o mov DWORD PTR [eax], 305419896; Linha 12345678H?
o seguinte trecho de código prova:
int main (int argc, char * argv)
{
União {
char ca [4];
Tt;
}uma;
a.ca [0] = a.ca [1] = a. [ca [2] = a.ca [3] = 1;
foo (& a.t);
printf ("% # x,% # x,% # x,% # x \ n", a.ca [0], a.ca [1], a.ca [2], a.ca [3]) ;
retornar 0;
}
o resultado é: 0x78, 0x56, 0x34, 0x12
- após remover a declaração direta da enumeração T e mover a definição da função foo após a definição da enumeração T: o resultado é OK:
a instrução principal acima se torna:
mov BYTE PTR [eax], 120; 00000078H
o resultado final é: 0x78, 0x1, 0x1, 0x1
Observe que o valor não está sendo substituído
Portanto, o uso da declaração direta de enum no VC é considerado prejudicial.
BTW, para não surpreender, a sintaxe para declaração do tipo subjacente é a mesma que em C #. Na prática, achei que vale a pena economizar 3 bytes, especificando o tipo subjacente como char quando falar com o sistema incorporado, que é limitado por memória.