2017-02-16 8 views
21

czytałem kodu źródłowego zmq, i natknąłem się na następujący typedefCo oznacza podkreślenie w strukturze typedef?

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

Nie rozumiem, co oznacza, podkreślenia w tej definicji. Czy ktoś mógłby pomóc rzucić trochę światła?

+30

To tylko nazwa zmiennej. – cup

+4

Uwaga: C11 7.1.3 Zarezerwowane identyfikatory: "... Wszystkie identyfikatory, które zaczynają się od podkreślenia, są zawsze zarezerwowane do użycia jako identyfikatory z zakresem pliku w zwykłych i nazwanych spacjach nazw." Tutaj '_' jest nazwą pola, więc wydaje się, że nie narusza tego. – chux

+0

Przestrzenie nazw @chux są zdefiniowane w 6.2.3. – OrangeDog

Odpowiedz

32

Podkreślenie (_) jest prawidłowym identyfikatorem, w tym przypadku nazwą członka struktury. Nie ma żadnego specjalnego, co oznacza, że ​​takie.

Cytowanie C11, rozdział §6.4.2.1, Identyfikatory

Identyfikator jest ciągiem znaków nondigit (w tym podkreślenia _ Z małe i wielkie litery łacińskie i innych znaków) i cyfry , co oznacza jeden lub więcej podmiotów [....]

AFAIR jest to prawdą w przypadku C++, również można znaleźć w rozdziale 2.11, C++ 14.

19

To nic nie znaczy, to po prostu nazwa członka struktury.

To nie jest nazwa najbardziej komunikatywna, ale prawdopodobnie wybrano ją nieco "tajną".

Identyfikator zasadniczo musi pasować do [A-Za-z_][A-Za-z_0-9]*, a ten to robi.

3

Od cppreference, że nie ma kopii Standardu przeze mnie:

Identyfikator jest dowolnie długi ciąg cyfr, podkreśleń, małe i wielkie litery łacińskie, a większość znaków Unicode

Tak więc _ jest nazwą zmiennej. Zobacz także

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

odsyłające na użyciu podkreślenia w identyfikatorach

+1

'_' jest nazwą pola. To nie jest zmienna w kodzie OP. – chux

+4

@chux: Jeśli musisz przejść na ten poziom pedanterii, będziesz musiał wybrać inny termin niż "pole", ponieważ ani C++, ani C nie definiuje tego terminu. To jest wymyślone. Osobiście uważam, że "zmienna" jest w porządku; "zmienna składowa" jest akceptowalna kolokwialnie. Prawdziwym terminem, którego szukasz, jest "członek danych". –

+0

@LightnessRacesinOrbit Zgoda na słabość "pola". _data member_ jest lepszy. BTW _filed_ nie jest napisany przeze mnie, tylko termin na fragmenty rekordu danych w [innym języku] (http://www.fortran.com/F77_std/rjcnf0001-sh-13.html) – chux

1

W jednym słowie? Nic. _ To postać jak każda inna i może być używany do nazwy zmiennej ...

Większość programistów jednak użyć _ zastąpić spacje w nazwach zmiennych ... więc można zrobić coś takiego:

int my_darling_little_beloved_variable;

12

W kilku językach istnieje konwencja do używania identyfikatora _ dla zmiennych "do not care", które nie powinny być nigdy przywoływane. Na przykład, można napisać na schemacie/Lisp

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

W tym przypadku nie ma problemu z scopingu ponieważ można przeniesieniu _ tak często, jak tylko chcesz. W C/C++ ta konwencja nie jest do końca użyteczna, ponieważ wiele konfliktów powodowałoby wiele zastosowań.Nie jest konieczne do ignorowanych parametrów, ponieważ można po prostu pominąć je całkowicie:

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

Jednak jako jedyny substytut rozmiarze w strukturze (dla którego jest tu użyty), nie można pominąć identyfikator, a ty będziesz potrzebuje tylko jednego identyfikatora na przestrzeń nazw. Tak więc w tym przypadku ta konwencja działa. Ale jako idiomatyczny wzór, jest on używany w innych językach o wiele więcej.