Vorwärtsdeklaration von Enumerationen in C: Einschränkungen und Problemumgehungen
In C war die Vorwärtsdeklaration von Enumerationen bisher nicht möglich, da die Größe der Enumeration davon abhing dessen Inhalt. Mit der Einführung von C 11 wurde jedoch eine Vorwärtsdeklaration möglich, solange die Größe der Aufzählung explizit angegeben wird.
Problemstellung:
Das ursprüngliche Problem trat auf Beim Versuch, eine Enumeration weiterzuleiten, gehen Sie wie folgt vor:
enum E; void Foo(E e); enum E {A, B, C};
Dieser Code wurde von abgelehnt Compiler.
Erklärung:
In C 03 und früheren Versionen war die Vorwärtsdeklaration von Enumerationen nicht zulässig, da der Compiler dazu die Größe der Enumeration kennen musste speichert seine Werte. Die Größe einer Aufzählung hängt von der Anzahl und dem Typ ihrer Aufzählungswerte ab. Ohne diese Informationen konnte der Compiler keinen Speicher für die Aufzählung zuweisen.
Lösung in C 11 und höher:
In C 11 und späteren Versionen Deklaration von Aufzählungen weiterleiten ist durch explizite Angabe der Größe der Aufzählung möglich. Dies kann mit der Aufzählung erfolgen:
Zum Beispiel:
enum Enum : unsigned int; // Forward declaration with an underlying type void Foo(Enum e); // Definition of the enum in a separate source file enum Enum { VALUE1, VALUE2, VALUE3 };
Dieser Code wird jetzt erfolgreich kompiliert.
Überlegungen zu privaten Enum-Werten:
Im genannten spezifischen Szenario, wo sich die Enum-Werte befinden sollten Obwohl der Ansatz der Vorwärtsdeklaration privat gehalten wird, ist er immer noch praktikabel. Die Aufzählung kann privat in einer Header-Datei deklariert und intern in der Implementierungsdatei definiert werden, ohne dass die Aufzählungswerte den Clients zugänglich gemacht werden.
Es ist jedoch wichtig zu beachten, dass Vorwärtsdeklarationen den Zugriff auf die darin enthaltenen Aufzählungswerte nicht verhindern dieselbe Übersetzungseinheit (d. h. dieselbe Quelldatei oder derselbe Satz von Dateien, die zusammen kompiliert werden). Daher ist es weiterhin möglich, von anderen Teilen des Programms, die Zugriff auf die Header-Datei haben, auf die Enum-Werte zuzugreifen.
Das obige ist der detaillierte Inhalt vonKann ich deklarierte Enums in C weiterleiten und wie?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!