Einige C ++ - Compiler erlauben anonyme Vereinigungen und Strukturen als Erweiterung von Standard-C ++. Es ist ein bisschen syntaktischer Zucker, der gelegentlich sehr hilfreich ist.
Was ist die Begründung, die verhindert, dass dies Teil des Standards ist? Gibt es eine technische Straßensperre? Eine philosophische? Oder einfach nicht genug, um es zu rechtfertigen?
Hier ist ein Beispiel von dem, wovon ich spreche:
struct vector3 {
union {
struct {
float x;
float y;
float z;
};
float v[3];
};
};
Mein Compiler akzeptiert dies, warnt jedoch davor, dass "nameless struct / union" eine nicht standardmäßige Erweiterung von C ++ ist .
struct { int i; } a; a.i = 0;
(der Typ hat keinen Namen). Der zweite ist dieser, den C ++ nicht unterstützt:struct { int i; }; i = 0;
(Der Typ hat keinen Namen und entweicht in den umgebenden Bereich). C ++, jedoch funktioniert sowohl unbenannte und anonym unterstützen Gewerkschaften .Antworten:
Wie andere bereits betont haben, sind anonyme Gewerkschaften in Standard-C ++ zulässig, anonyme Strukturen jedoch nicht.
Der Grund dafür ist, dass C anonyme Gewerkschaften unterstützt, aber keine anonymen Strukturen *. Daher unterstützt C ++ die ersteren aus Kompatibilitätsgründen, die letzteren jedoch nicht, da sie aus Kompatibilitätsgründen nicht benötigt werden.
Darüber hinaus sind anonyme Strukturen in C ++ nicht sehr nützlich. Die Verwendung, die Sie demonstrieren, um eine Struktur mit drei Floats zu haben, auf die entweder von
.v[i]
oder verwiesen werden kann.x
,.y
führt.z
meines Erachtens zu einem undefinierten Verhalten in C ++. In C ++ können Sie beispielsweise nicht an ein Mitglied einer Gewerkschaft schreiben.v[1]
und dann beispielsweise von einem anderen Mitglied lesen.y
. Obwohl Code, der dies tut, nicht ungewöhnlich ist, ist er nicht wirklich gut definiert.Die Funktionen von C ++ für benutzerdefinierte Typen bieten alternative Lösungen. Beispielsweise:
* C11 fügt anscheinend anonyme Strukturen hinzu, sodass eine zukünftige Überarbeitung von C ++ sie möglicherweise hinzufügen kann.
quelle
Ich werde sagen, Sie können Ihre
vector3
Erklärung bereinigen, indem Sie einfach a verwendenunion
Sicher, anonyme Strukturen waren eine MSVC-Erweiterung . Aber ISO C11 erlaubt es jetzt und gcc erlaubt es , ebenso wie Apples llvm-Compiler.
Warum in C11 und nicht in C ++ 11? Ich bin mir nicht sicher, aber praktisch die meisten (gcc ++, MSVC ++ und Apples C ++ - Compiler) C ++ - Compiler unterstützen sie.
quelle
Nicht sicher was du meinst. Abschnitt 9.5 der C ++ - Spezifikation, Abschnitt 2:
Sie können solche Dinge auch tun:
Nicht immer sehr nützlich ... obwohl manchmal nützlich in bösen Makrodefinitionen.
quelle
Gewerkschaften können anonym sein; siehe Standard, 9.5 Absatz 2.
Welchen Zweck sehen Sie in einer anonymen Struktur oder Klasse als erfüllend? Bevor ich darüber spekuliere, warum etwas nicht im Standard enthalten ist, möchte ich eine Vorstellung davon haben, warum es so sein sollte, und ich sehe keine Verwendung für eine anonyme Struktur.
quelle
Basierend auf der Bearbeitung, den Kommentaren und diesem MSDN-Artikel: Anonyme Strukturen riskiere ich eine Vermutung - es passt schlecht zum Konzept der Kapselung. Ich würde nicht erwarten, dass ein Mitglied einer Klasse mit meinem Klassennamensraum herumspielt, außer nur ein Mitglied hinzuzufügen. Darüber hinaus können Änderungen an der anonymen Struktur meine Klasse ohne Erlaubnis beeinflussen.
quelle
Dein Code
ist wie
das ist sicherlich ungültig (in C99 und früher).
Der Grund ist wahrscheinlich , das Parsen zu vereinfachen (in C), da Sie in diesem Fall nur überprüfen müssen, ob der Struktur- / Vereinigungskörper nur "Deklaratoranweisungen" wie enthält
Das sagte, GCC und „andere Compilern“ unterstützt unnamed Felder als Erweiterung.
Bearbeiten: Anonyme Strukturen werden jetzt offiziell in C11 unterstützt (§6.7.2.1 / 13).
quelle
union { ... }
das anders ist alsstruct { ... }
. Ersteres ist gültig, letzteres jedoch nicht.union { ... };
ist der ungültige Kommentar nicht korrekt.