Per VC, ecco il test sulla dichiarazione diretta e sulla specifica del tipo sottostante:
- il seguente codice è compilato ok.
typedef int myint;
enum T;
void foo (T * tp)
{
* tp = (T) 0x12345678;
}
enum T: char
{
UN
};
Ma ho ricevuto l'avviso per / W4 (/ W3 non ha questo avviso)
avviso C4480: estensione non standard utilizzata: specifica del tipo sottostante per enum 'T'
VC (Microsoft (R) 32-bit C / C ++ Ottimizzazione versione del compilatore 15.00.30729.01 per 80x86) sembra difettoso nel caso precedente:
- quando si vede enum T; VC presuppone che il tipo enum T utilizzi 4 byte predefiniti come tipo sottostante, quindi il codice assembly generato è:
? foo @@ YAXPAW4T @@@ Z PROC; foo
; File e: \ work \ c_cpp \ cpp_snippet.cpp
; Linea 13
spingere ebp
mov ebp, esp
; Linea 14
mov eax, DWORD PTR _tp $ [ebp]
mov DWORD PTR [eax], 305419896; 12345678H
; Linea 15
pop ebp
ret 0
? foo @@ YAXPAW4T @@@ Z ENDP; foo
Il codice assembly sopra riportato viene estratto direttamente da /Festest.asm, non è una mia ipotesi personale. Vedi il mov DWORD PTR [eax], 305419896; Linea 12345678H?
il seguente frammento di codice lo dimostra:
int main (int argc, char * argv)
{
unione {
char ca [4];
T t;
}un;
a.ca [0] = a.ca [1] = a. [ca [2] = a.ca [3] = 1;
pippo (& a.t);
printf ("% # x,% # x,% # x,% # x \ n", a.ca [0], a.ca [1], a.ca [2], a.ca [3]) ;
ritorna 0;
}
il risultato è: 0x78, 0x56, 0x34, 0x12
- dopo rimuovere la dichiarazione in avanti di enum T e spostare la definizione di funzione foo dopo la definizione di enum T: il risultato è OK:
le istruzioni chiave sopra diventano:
mov BYTE PTR [eax], 120; 00000078H
il risultato finale è: 0x78, 0x1, 0x1, 0x1
Si noti che il valore non viene sovrascritto
Quindi l'uso della dichiarazione anticipata di enum in VC è considerato dannoso.
A proposito, per non sorprendere, la sintassi per la dichiarazione del tipo sottostante è la stessa in C #. In pratica ho scoperto che vale la pena salvare 3 byte specificando il tipo sottostante come char quando si parla con il sistema incorporato, che è limitato dalla memoria.