Gibt es eine Bedeutung hinter dem Zulassen der Sichtbarkeit von verschachtelten Strukturen außerhalb der Struktur in C, aber nicht in C++? Ich habe keine Referenz oder Relevanz gefunden.
struct a
{
struct b{
};
};
int main(){
struct b var; // allowed in C not in C++.
}
In C++ würden Sie verwenden a::b var;
– Ninja im Ruhestand
27. November 2011 um 7:15 Uhr
Irgendwie ist mir nie aufgefallen, dass es einen Unterschied gibt…
– Benutzer541686
27. November 2011 um 7:18 Uhr
Wurde der operator:: nicht erst in C++ eingeführt, zusammen mit dem eigentlichen Begriff der unterschiedlichen Geltungsbereiche?
– Kos
27. November 2011 um 7:25 Uhr
James McNellis
Es ist in C gültig, weil C einen einzigen Namensraum hat, in dem alle nicht lokalen Typen (dh Typen, die nicht in Funktionen deklariert sind) definiert sind; es gibt kein Scoping von Typen mit Namespaces oder Verschachtelung.
Geben Sie in C++ ein b ist als Mitglied der Klasse verschachtelt adaher muss sein Name mit dem Gültigkeitsbereich qualifiziert werden, in dem er deklariert ist.
Hat C nicht zwei separate globale Namensräume für skalare Typnamen und für Strukturen oder so etwas?
– Kerrek SB
27. November 2011 um 13:37 Uhr
@KerrekSB: Ja, in gewisser Weise. Der Namespace, um den es hier geht, ist der Tags-Namespace (in struct a { };das Etikett ist a).
– James McNellis
27. November 2011 um 19:02 Uhr
Siehe ISO C99, 6.2.1 Scopes of Identifiers, Absatz 7 zum Geltungsbereich von Struct in C99.
– Atafar
22. Mai 2015 um 7:04 Uhr
Ein Anwendungsbeispiel wäre schön.
– glibg10b
26. August 2021 um 12:35 Uhr
Ich glaube, die Möglichkeit, verschachtelte Strukturen außerhalb der Struktur zu referenzieren, wurde in C++ entfernt, um das Verbergen von Daten zu verbessern. Wenn Sie extern auf eine verschachtelte Struktur zugreifen müssen, sollte es wahrscheinlich gar keine verschachtelte Struktur sein.
Wikipedia sagt: “In C und C++ kann man verschachtelte Strukturtypen definieren, aber der Gültigkeitsbereich wird anders interpretiert (in C++ wird eine verschachtelte Struktur nur innerhalb des Gültigkeitsbereichs/Namensraums der äußeren Struktur definiert).” (http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B). Es sagt nicht warumaber zumindest erkennt es den Unterschied an.
Sie können jedoch den Namensraumauflösungsoperator verwenden, um auf die Struktur zuzugreifen.
Das warum scheint Namespace-Verschmutzung zu vermeiden. Aus www2.research.att.com/~bs/sibling_rivalry.pdf: „In C sind Strukturbereiche, die scheinbar verschachtelt sind, nicht, da innerhalb deklarierte Strukturnamen als im äußeren Bereich liegend betrachtet werden. Dies erwies sich in C++ als nicht handhabbar, wo verschachtelte Klassen häufig als Implementierungsdetails verwendet wurden. Folglich C++ verschachtelte Strukturumfänge übernommen.”
– Onkel Bens
27. November 2011 um 10:54 Uhr
+1 für “sollte wahrscheinlich überhaupt keine verschachtelte Struktur sein”.
– mskfisher
2. Oktober 2013 um 19:53 Uhr
Da sich b innerhalb von a befindet, müssen Sie verwenden struct a::b stattdessen (und anders als in C ist das Schlüsselwort struct optional).
Sie können in C++ nichts ohne Gültigkeitsbereich deklarieren. In Ihrem Beispiel liegt struct b innerhalb von struct a, der Compiler weiß nicht, wo er struct b finden soll
musst du verwenden
struct a :: b var;
In C gibt es keine Einschränkung für den Geltungsbereich, aber C++ sorgt für eine Einschränkung
13686800cookie-checkVerschachtelte Strukturen in C und C++yes
In C++ würden Sie verwenden
a::b var;
– Ninja im Ruhestand
27. November 2011 um 7:15 Uhr
Irgendwie ist mir nie aufgefallen, dass es einen Unterschied gibt…
– Benutzer541686
27. November 2011 um 7:18 Uhr
Wurde der operator:: nicht erst in C++ eingeführt, zusammen mit dem eigentlichen Begriff der unterschiedlichen Geltungsbereiche?
– Kos
27. November 2011 um 7:25 Uhr