Para VC, aquí está la prueba sobre la declaración directa y la especificación del tipo subyacente:
- el siguiente código está compilado ok.
typedef int myint;
enumeración T;
nulo foo (T * tp)
{
* tp = (T) 0x12345678;
}
enumeración T: char
{
UNA
};
Pero recibí la advertencia para / W4 (/ W3 no incurre en esta advertencia)
advertencia C4480: extensión no estándar utilizada: especificación del tipo subyacente para la enumeración 'T'
VC (Microsoft (R) 32 / bit C / C ++ Optimizing Compiler Version 15.00.30729.01 for 80x86) parece defectuoso en el caso anterior:
- al ver enum T; VC supone que el tipo de enumeración T usa 4 bytes predeterminados int como tipo subyacente, por lo que el código de ensamblado generado es:
? foo @@ YAXPAW4T @@@ Z PROC; foo
; Archivo e: \ work \ c_cpp \ cpp_snippet.cpp
; Línea 13
empujar ebp
mov ebp, esp
; Línea 14
mov eax, DWORD PTR _tp $ [ebp]
mov DWORD PTR [eax], 305419896; 12345678H
; Línea 15
pop ebp
ret 0
? foo @@ YAXPAW4T @@@ Z ENDP; foo
El código de ensamblaje anterior se extrae directamente de /Fatest.asm, no es mi suposición personal. ¿Ves el mov DWORD PTR [eax], 305419896; 12345678H línea?
el siguiente fragmento de código lo demuestra:
int main (int argc, char * argv)
{
Unión {
char ca [4];
T t;
}una;
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]) ;
devuelve 0;
}
El resultado es: 0x78, 0x56, 0x34, 0x12
- después de eliminar la declaración hacia adelante de enum T y mover la definición de función foo después de la definición de enum T: el resultado es correcto:
la instrucción clave anterior se convierte en:
mov BYTE PTR [eax], 120; 00000078H
El resultado final es: 0x78, 0x1, 0x1, 0x1
Tenga en cuenta que el valor no se sobrescribe
Por lo tanto, el uso de la declaración directa de enumeración en VC se considera perjudicial.
Por cierto, para no sorprender, la sintaxis para la declaración del tipo subyacente es la misma que en C #. En la práctica, descubrí que vale la pena guardar 3 bytes especificando el tipo subyacente como char cuando se habla con el sistema incorporado, que tiene memoria limitada.