Verschachtelte Strukturen in C und C++

Lesezeit: 3 Minuten

Benutzer-Avatar
nikel

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

Benutzer-Avatar
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

1368680cookie-checkVerschachtelte Strukturen in C und C++

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy