Pour VC, voici le test sur la déclaration directe et la spécification du type sous-jacent:
- le code suivant est compilé ok.
typedef int myint;
enum T;
void foo (T * tp)
{
* tp = (T) 0x12345678;
}
énumération T: char
{
UNE
};
Mais j'ai reçu l'avertissement pour / W4 (/ W3 n'encourra pas cet avertissement)
avertissement C4480: extension non standard utilisée: spécification du type sous-jacent pour l'énumération 'T'
VC (Microsoft (R) 32-bit C / C ++ Optimizing Compiler Version 15.00.30729.01 pour 80x86) semble bogué dans le cas ci-dessus:
- en voyant l'énumération T; VC suppose que le type enum T utilise int 4 octets par défaut comme type sous-jacent, donc le code d'assembly généré est:
? foo @@ YAXPAW4T @@@ Z PROC; foo
; Fichier e: \ work \ c_cpp \ cpp_snippet.cpp
; Ligne 13
pousser ebp
mov ebp, esp
; Ligne 14
mov eax, DWORD PTR _tp $ [ebp]
mov DWORD PTR [eax], 305419896; 12345678H
; Ligne 15
pop ebp
ret 0
? foo @@ YAXPAW4T @@@ Z ENDP; foo
Le code assembleur ci-dessus est extrait directement de /Fatest.asm, pas ma supposition personnelle. Voyez-vous le mov DWORD PTR [eax], 305419896; Ligne 12345678H?
l'extrait de code suivant le prouve:
int main (int argc, char * argv)
{
syndicat {
char ca [4];
T t;
}une;
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]) ;
retourner 0;
}
le résultat est: 0x78, 0x56, 0x34, 0x12
- après avoir supprimé la déclaration avant de l'énum T et déplacer la définition de la fonction foo après la définition de l'énum T: le résultat est OK:
l'instruction clé ci-dessus devient:
mov BYTE PTR [eax], 120; 00000078H
le résultat final est: 0x78, 0x1, 0x1, 0x1
Notez que la valeur n'est pas écrasée
Par conséquent, l'utilisation de la déclaration en avant d'énumération dans VC est considérée comme nuisible.
BTW, pour ne pas surprendre, la syntaxe de déclaration du type sous-jacent est la même qu'en C #. Dans la pratique, j'ai trouvé qu'il valait la peine d'économiser 3 octets en spécifiant le type sous-jacent comme char lorsque vous parlez au système intégré, qui est limité en mémoire.