Für VC ist hier der Test zur Vorwärtsdeklaration und Angabe des zugrunde liegenden Typs:
- Der folgende Code ist in Ordnung kompiliert.
typedef int myint;
Aufzählung T;
void foo (T * tp)
{
* tp = (T) 0x12345678;
}}
Aufzählung T: char
{
EIN
};
Habe aber die Warnung für / W4 erhalten (/ W3 hat diese Warnung nicht erhalten)
Warnung C4480: Nicht standardmäßige Erweiterung verwendet: Angabe des zugrunde liegenden Typs für die Aufzählung 'T'
VC (Microsoft (R) 32-Bit-C / C ++ - Optimierungscompiler Version 15.00.30729.01 für 80x86) sieht im obigen Fall fehlerhaft aus:
- wenn man Enum T sieht; VC geht davon aus, dass der Aufzählungstyp T standardmäßig 4 Byte int als zugrunde liegenden Typ verwendet. Der generierte Assemblycode lautet also:
foo @@ YAXPAW4T @@@ Z PROC; foo
;; Datei e: \ work \ c_cpp \ cpp_snippet.cpp
;; Zeile 13
ebp drücken
mov ebp, esp
;; Zeile 14
mov eax, DWORD PTR _tp $ [ebp]
mov DWORD PTR [eax], 305419896; 12345678H
;; Zeile 15
Pop Ebp
ret 0
foo @@ YAXPAW4T @@@ Z ENDP; foo
Der obige Assembler-Code wird direkt aus /Fatest.asm extrahiert, nicht meine persönliche Vermutung. Sehen Sie den mov DWORD PTR [eax], 305419896; 12345678H Linie?
Das folgende Code-Snippet beweist es:
int main (int argc, char * argv)
{
Gewerkschaft {
char ca [4];
T t;
}ein;
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]) ;;
return 0;
}}
Das Ergebnis ist: 0x78, 0x56, 0x34, 0x12
- Nachdem Sie die Vorwärtsdeklaration von Enum T entfernt und die Definition der Funktion foo nach der Definition von Enum T verschoben haben, ist das Ergebnis OK:
Die obige Schlüsselanweisung lautet:
mov BYTE PTR [eax], 120; 00000078H
Das Endergebnis ist: 0x78, 0x1, 0x1, 0x1
Beachten Sie, dass der Wert nicht überschrieben wird
Die Verwendung der Forward-Deklaration von enum in VC wird daher als schädlich angesehen.
Übrigens ist es nicht überraschend, dass die Syntax für die Deklaration des zugrunde liegenden Typs dieselbe ist wie in C #. In der Praxis habe ich festgestellt, dass es sich lohnt, 3 Bytes zu sparen, indem der zugrunde liegende Typ als char angegeben wird, wenn mit dem eingebetteten System gesprochen wird, das nur über begrenzten Speicher verfügt.