2017-02-16 1 views
21

ich den Quellcode von ZMQ zu lesen, und kam über die folgenden typedefWas bedeutet der Unterstrich in der typedef Struktur?

typedef struct {unsigned char _ [32];} zmq_msg_t; 

Ich verstehe nicht, was das Unterstreichungs in dieser Definition bedeutet. Könnte jemand bitte helfen, Licht zu holen?

+30

Es ist nur ein Variablenname. – cup

+4

Hinweis: C11 7.1.3 Reservierte Bezeichner: "... Alle Bezeichner, die mit einem Unterstrich beginnen, sind immer für die Verwendung als Bezeichner mit dem Dateibereich sowohl im normalen als auch im Namensraum reserviert." Here '_' ist ein Feldname, so scheint dies nicht zu verletzen. – chux

+0

@chux Namespaces sind in 6.2.3 definiert – OrangeDog

Antwort

32

Ein Unterstrich (_) ist eine gültige Kennung, in diesem Fall ein Name des Elements der Struktur. Es hat keine spezielle Bedeutung als solche.

C11 Zitiert, Kapitel §6.4.2.1, Identifiers

Eine Kennung ist eine Folge von nondigit Zeichen (einschließlich der Unterstreichungs _, die Klein- und Groß lateinischen Buchstaben und andere Zeichen) und Ziffern , die bezeichnen eine oder mehr Entitäten [....]

AFAIR, dies im Fall von C++, ist auch wahr, siehe Kapitel 2.11, C++ 14.

19

Es bedeutet nichts, es ist einfach der Name des Strukturelements.

Es ist nicht der kommunikativste Name, aber es ist wahrscheinlich ein bisschen "geheim" gewählt.

Ein Bezeichner muss im Grunde übereinstimmen [A-Za-z_][A-Za-z_0-9]*, und dies tut.

3

Von cppreference, für eine Kopie von Norm wird von mir mit:

Eine Kennung eine beliebig lange Folge von Ziffern ist, unterstreicht, Klein- und Groß lateinische Buchstaben, und die meisten Unicode-Zeichen

Somit ist _ ein Variablenname. Siehe auch

What are the rules about using an underscore in a C++ identifier?

Referenz auf Unterstrichen in Identifikatoren

+1

'_' ist ein Feldname. Dies ist keine Variable im OP-Code. – chux

+4

@chux: Wenn Sie zu dieser Pedanterieebene gehen müssen, müssen Sie einen anderen Begriff als "Feld" auswählen, da weder C++ noch C diesen Begriff definieren. Es ist erfunden. Persönlich halte ich "Variable" für gut. "Elementvariable" ist umgangssprachlich akzeptabel. Der eigentliche Begriff, nach dem Sie suchen, ist "Datenmitglied". –

+0

@LightnessRacesinOrbit Vereinbaren Sie die Schwäche des "Feldes". _data member_ ist besser. BTW _filed_ wird von mir nicht erfunden, nur ein Begriff für einen Teilabschnitt eines Datensatzes in [einer anderen Sprache] (http://www.fortran.com/F77_std/rjcnf0001-sh-13.html) – chux

1

In einem Wort verwenden? Nichts. _ Ist ein Zeichen, wie jeder andere und kann verwendet werden, um eine Variable zu nennen ...

Die meisten Programmierer verwenden jedoch _ in Leerzeichen in Variablennamen ersetzen ... so können Sie etwas tun:

int my_darling_little_beloved_variable;

12

In mehreren Sprachen gibt es eine Konvention, den Bezeichner _ für "egal" Variablen zu verwenden, die niemals referenziert werden sollen. Zum Beispiel könnten Sie in Scheme/Lisp

(let* ((x ...) 
     (_ ...<some side effect depending on x>) 
     (y ...<something making use of the side effect's result>)) 
    ...) 

In diesem Fall schreiben gibt es kein Problem mit Scoping da Sie _ so oft neu zuordnen können, wie Sie möchten. In C/C++ ist diese Konvention nicht durchführbar, da häufig mehrere Verwendungen von _ miteinander kollidieren würden.Es ist nicht ignoriert Parameter erforderlich, da Sie nur sie ganz weglassen:

int fun(int a, int, int b) { return a + b; } 

jedoch als einzige Größe Ersatz in einer Struktur (für die er hier verwendet wird), können Sie nicht die Kennung nicht angeben, und Sie werden benötigen nur einen Bezeichner pro Namespace. In diesem Fall funktioniert diese Konvention. Aber als ein idiomatisches Muster wird es in anderen Sprachen viel mehr verwendet.