W C ++ powszechne jest nazywanie zmiennych składowych z pewnym prefiksem, który oznacza, że są to zmienne składowe, a nie zmienne lokalne lub parametry. Jeśli pochodzisz z tła MFC, prawdopodobnie będziesz używać m_foo
. Od myFoo
czasu do czasu widziałem .
Wydaje się, że C # (lub po prostu .NET) zaleca używanie tylko podkreślenia, jak w _foo
. Czy jest to dozwolone przez standard C ++?
c++
naming-conventions
standards
c++-faq
Roger Lipscombe
źródło
źródło
Odpowiedzi:
Reguły (które nie zmieniły się w C ++ 11):
std
przestrzeni nazw jest zarezerwowane. (Możesz jednak dodawać specjalizacje do szablonów).Od standardu C ++ 2003:
Ponieważ C ++ jest oparty na standardzie C (1.1 / 2, C ++ 03), a C99 jest odniesieniem normatywnym (1.2 / 1, C ++ 03), mają one również zastosowanie, od standardu C z 1999 roku:
Mogą obowiązywać inne ograniczenia. Na przykład standard POSIX rezerwuje wiele identyfikatorów, które prawdopodobnie pojawią się w normalnym kodzie:
E
litery następują po cyfrach lub wielkich literach:is
lubto
następują po niej małą literąLC_
po których następuje wielka literaf
lubl
są zastrzeżoneSIG
od dużej litery są zastrzeżoneSIG_
od dużej litery są zastrzeżonestr
,mem
lubwcs
poprzedzające małą literę są zastrzeżonePRI
lubSCN
po każdej małej litery lubX
są zastrzeżone_t
są zastrzeżoneMimo że używanie tych nazw do własnych celów może nie powodować problemów, zwiększają one możliwość konfliktu z przyszłymi wersjami tego standardu.
Osobiście nie zaczynam identyfikatorów od podkreślników. Nowy dodatek do mojej zasady: nie używaj nigdzie podwójnych znaków podkreślenia, co jest łatwe, ponieważ rzadko używam podkreślenia.
Po przestudiowaniu tego artykułu nie kończę już moich identyfikatorów,
_t
ponieważ jest to zastrzeżone przez standard POSIX.Zasada o każdym identyfikatorze kończącym się na
_t
bardzo mnie zaskoczyła. Myślę, że to standard POSIX (jeszcze nie jestem pewien) szukający wyjaśnień i oficjalnego rozdziału i wersetu. Ten pochodzi z GNU Libtool ręcznych , wymieniające zastrzeżonych nazw.CesarB podał następujący link do zastrzeżonych symboli POSIX 2004 i zauważa, że „można tam znaleźć wiele innych zastrzeżonych prefiksów i sufiksów”. Tutaj są zdefiniowane symbole zastrzeżone POSIX 2008 . Ograniczenia są nieco bardziej szczegółowe niż powyższe.
źródło
_Bool
i_Imaginary
nie istnieje w C ++? Język C ++ jest zdefiniowany jawnie, nie w kategoriach „edycji” w C, w przeciwnym razie standard może być znacznie krótszy!Zasady unikania kolizji nazw znajdują się zarówno w standardzie C ++ (patrz książka Stroustrupa), jak i wspomniane przez guru C ++ (Sutter itp.).
Reguła osobista
Ponieważ nie chciałem zajmować się sprawami i chciałem prostej zasady, zaprojektowałem osobistą, która jest jednocześnie prosta i poprawna:
Podczas nazywania symbolu unikniesz kolizji z bibliotekami kompilatora / systemu operacyjnego / standardowego, jeśli:
Oczywiście umieszczenie kodu w unikalnej przestrzeni nazw pomaga również uniknąć kolizji (ale nie chroni przed złymi makrami)
Kilka przykładów
(Używam makr, ponieważ bardziej zanieczyszczają kod symboli C / C ++, ale może to być wszystko od nazwy zmiennej do nazwy klasy)
Wyciągi z wersji roboczej C ++ 0x
Z pliku n3242.pdf (oczekuję, że końcowy standardowy tekst będzie podobny):
Ale również:
Ta ostatnia klauzula jest myląca, chyba że weźmiesz pod uwagę, że nazwa zaczynająca się od jednego znaku podkreślenia, po której następuje mała litera, byłaby OK, gdyby nie została zdefiniowana w globalnej przestrzeni nazw ...
źródło
__WRONG_AGAIN__
zawiera dwa kolejne podkreślenia (dwa na początku i dwa na końcu), więc jest to niezgodne ze standardem.WRONG__WRONG
zawiera dwa kolejne podkreślenia (dwa w środku), więc zgodnie ze standardem jest to niewłaściwe__attribute__
dla GCC).1234567L
lub4.0f
; IIRC odnosi się to do ohttp: //en.cppreference.com/w/cpp/language/user_literalWhy is there any problem of having two consecutive underscores in the middle according to the standard?
Ponieważ standard mówi, że są zastrzeżone. To nie jest rada dotycząca dobrego lub złego stylu. To decyzja ze standardu. Dlaczego tak postanowili? Sądzę, że pierwsze kompilatory już wcześniej stosowały takie konwencje nieformalnie przed standaryzacją.Z MSDN :
Oznacza to, że możesz użyć pojedynczego podkreślenia jako prefiksu zmiennej składowej, o ile po nim następuje mała litera.
Jest to najwyraźniej zaczerpnięte z sekcji 17.4.3.1.2 standardu C ++, ale nie mogę znaleźć oryginalnego źródła pełnego standardu online.
Zobacz także to pytanie .
źródło
Jeśli chodzi o drugą część pytania, często umieszcza się podkreślenie na końcu nazwy zmiennej, aby nie kolidowało z niczym wewnętrznym.
Robię to nawet w klasach i przestrzeniach nazw, ponieważ muszę wtedy zapamiętać tylko jedną regułę (w porównaniu do „na końcu nazwy w zakresie globalnym i na początku nazwy wszędzie indziej”).
źródło
Tak, podkreślenia mogą być używane w dowolnym miejscu w identyfikatorze. Uważam, że są to następujące reguły: dowolne z az, AZ, _ w pierwszym znaku i te + 0-9 dla następujących znaków.
Prefiksy podkreślenia są powszechne w kodzie C - pojedynczy znak podkreślenia oznacza „prywatny”, a podwójne podkreślenia są zwykle zarezerwowane do użytku przez kompilator.
źródło