C-Stil-Strukturdeklaration

8

Ich habe eine kurze Frage zu C-Stil-Strukturen. Ich habe einen Beispielcode durchforstet und eine Struktur gefunden, die folgendermaßen deklariert ist:

%Vor%

Bitte beachten Sie, dass STRUCTNAME beim zweiten Mal nicht mehr unterstrichen wird. Mein Verständnis war, dass dies einen einzelnen _STRUCTNAME namens STRUCTNAME deklarieren würde und keine weiteren Objekte dieser Struktur instanziiert werden könnten.

Dies scheint jedoch nicht der Fall zu sein. Eine Struktur dieses Typs wurde nie wirklich in dem Code instanziiert, außer an einer Stelle: in einem globalen Array solcher Objekte, das an zufälligen Orten verwendet wurde:

%Vor%

Beachten Sie das Fehlen eines Unterstrichs wieder (was ich dachte, war der Name des instanziierten Objekts?)

Ist mein Verständnis vollständig ausgeschaltet?

Könnte jemand erklären?

    
Klauss 25.07.2011, 05:21
quelle

5 Antworten

7
%Vor%

Dieser Codeabschnitt macht zwei Dinge:

  1. Definiert eine Struktur namens struct _STRUCTNAME und
  2. Erzeugt ein typedef dieser Struktur namens STRUCTNAME .

Der Grund dafür ist, dass im normalen C-Code die Art, wie Sie andernfalls struct (wie oben) deklarieren würden, wie folgt wäre:

%Vor%

Wenn jedoch typedef vorhanden ist, können Sie einfach Folgendes verwenden:

%Vor%

Dasselbe gilt für enum -Deklarationen.

    
Adam Maras 25.07.2011 05:26
quelle
4

STRUCTNAME ist der Typdef name.

_STRUCTNAME ist das 'Tag' für die Struktur, die sich in einem anderen Namensraum befindet.

Vor der ANSI-Standardisierung war der Struktur-Tag-Namespace in vielen Compilern nicht getrennt. Um eine Namenskollision mit dem Typedef-Namen zu verhindern, musste er anders sein. Seit der Standardisierung muss der Tag-Name jedoch nicht anders sein.

Sie sehen dieses Idiom häufig in Windows-Code, ohne Zweifel, weil es in vielen Beispielen aus dem SDK so war. Raymond Chen hat vor einiger Zeit einen Blogeintrag darüber geschrieben:

Ich bin mir auch sicher, dass es einige Kommentare darüber geben wird, wie der _STRUCTNAME -Bezeichner für die Implementierung reserviert ist. Es ist also keine gute Idee, dieses Formular in jedem Fall zu verwenden.

    
Michael Burr 25.07.2011 05:23
quelle
2
Michael Burr sagte:

  

Ich bin mir auch sicher, dass es einige Kommentare darüber geben wird, wie der _STRUCTNAME -Bezeichner für die Implementierung reserviert ist. Es ist also keine gute Idee, dieses Formular in jedem Fall zu verwenden.

OK, ich bin Spiel (aber ich wollte etwas Formatierung, so erhalten Sie stattdessen eine Antwort):

Ein Sprachstandard ist ein Vertrag zwischen Compiler-Writer und Compiler-User, wo jeder verspricht, bestimmte Dinge zu tun.

Die meisten mit _ beginnenden Bezeichner sind für die Implementierung reserviert - einschließlich alle Bezeichner beginnend mit _ , gefolgt von einem Großbuchstaben. Dies bedeutet, dass der Compiler-Writer sie für jeden Zweck verwenden darf, da der Compiler-Benutzer versprochen hat, sie nicht zu verwenden.

Compiler-Benutzer, die ihr Versprechen brechen, bekommen seltsame Ergebnisse.

Umgekehrt ist garantiert, dass alle Bezeichner, die der [anwendbare] Standard für die Implementierung nicht reserviert, dem Compiler-Benutzer zur Verfügung stehen, weil der Compiler-Schreiber versprochen hat, sie nicht zu benutzen.

Compiler-Writer, die ihr Versprechen brechen, erhalten Rückerstattungsanforderungen, wenn der gültige Code seltsame Ergebnisse erzielt.

Meine Präferenz besteht darin, eine nachgestellte _ auf Tag-Namen zu setzen, Wächter usw. einzuschließen, um sicherzustellen, dass ich mich außerhalb des Bereichs der Implementierung befinde; Also:

%Vor%

(Einige Puristen runzeln über typedef s nur als syntaktischen Zucker, aber C braucht hier und da etwas Zucker, sonst kann es ziemlich langweilig wirken.)

    
mlp 25.07.2011 06:09
quelle
0

Ich glaube, Ihre Verwirrung ist warum die ID-Liste am Ende der struct -Definition Instanzen nicht instanziiert. Der Grund dafür ist, dass Sie das Schlüsselwort typedef eingefügt haben.

Betrachte die syantax für typedef :

%Vor%

Was Sie getan haben, ist Ihre struct als Typdefinition. Anstatt Instanzen zu erstellen, definieren Sie einen Typ. Stellen Sie dies dem Instanziieren von Instanzen zur Verfügung, in denen die Struktur den Typ inline definiert:

%Vor%

Wenn Sie das Schlüsselwort typedef nicht angeben, gibt der Bezeichner nur Instanzen wie üblich an.

    
Peter 25.07.2011 05:55
quelle
0
%Vor%

Der obige Code wird nicht für den unvollständigen Typ für das Array kompilieren. Ich denke, dass sie Tippfehler sein sollten

%Vor%

Alternativ können Sie typedefs verwenden, ohne das struct-Schlüsselwort

anzugeben %Vor%     
cyber_raj 25.07.2011 10:41
quelle

Tags und Links