Reguły (które nie zmieniły się w C ++ 11):
- Zarezerwowane w dowolnym zakresie, w tym do wykorzystania jako makra implementacyjne :
- identyfikatory zaczynające się od znaku podkreślenia, po którym bezpośrednio następuje wielka litera
- identyfikatory zawierające sąsiadujące podkreślenia (lub „podwójne podkreślenie”)
- Zarezerwowane w globalnej przestrzeni nazw:
- identyfikatory rozpoczynające się znakiem podkreślenia
- Ponadto wszystko w
std
przestrzeni nazw jest zarezerwowane. (Możesz jednak dodawać specjalizacje do szablonów).
Od standardu C ++ 2003:
17.4.3.1.2 Nazwy globalne [lib.global.names]
Niektóre zestawy nazw i sygnatur funkcji są zawsze zarezerwowane dla implementacji:
- Każda nazwa, która zawiera podwójny znak podkreślenia (
__
) lub zaczyna się od znaku podkreślenia, po którym następuje wielka litera (2.11), jest zarezerwowana dla implementacji do dowolnego użytku.
- Każda nazwa rozpoczynająca się znakiem podkreślenia jest zarezerwowana dla implementacji i może być używana jako nazwa w globalnej przestrzeni nazw. 165
165) Takie nazwy są również zastrzeżone w przestrzeni nazw ::std
(17.4.3.1).
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:
7.1.3 Zastrzeżone identyfikatory
Każdy nagłówek deklaruje lub definiuje wszystkie identyfikatory wymienione w powiązanej podklasie i opcjonalnie deklaruje lub definiuje identyfikatory wymienione w powiązanej podklasie i identyfikatorach przyszłych bibliotek, które są zawsze zarezerwowane do dowolnego użytku lub do wykorzystania jako identyfikatory zakresu plików.
- Wszystkie identyfikatory rozpoczynające się znakiem podkreślenia i wielką literą lub innym znakiem podkreślenia są zawsze zarezerwowane do dowolnego użytku.
- Wszystkie identyfikatory rozpoczynające się znakiem podkreślenia są zawsze zarezerwowane do stosowania jako identyfikatory o zakresie pliku zarówno w zwykłej, jak i w przestrzeni nazw.
- Każda nazwa makra w dowolnym z poniższych podrozdziałów (łącznie z przyszłymi kierunkami biblioteki) jest zarezerwowana do użytku, tak jak określono, jeśli uwzględniono którykolwiek z powiązanych z nią nagłówków; chyba że wyraźnie zaznaczono inaczej (patrz 7.1.4).
- Wszystkie identyfikatory z zewnętrznym powiązaniem w dowolnym z poniższych podrozdziałów (w tym przyszłe kierunki bibliotek) są zawsze zarezerwowane do użycia jako identyfikatory z zewnętrznym łączeniem. 154
- Każdy identyfikator z zakresem pliku wymienionym w którejkolwiek z poniższych podklas (w tym przyszłe kierunki bibliotek) jest zarezerwowany do użycia jako nazwa makra i jako identyfikator z zakresem pliku w tej samej przestrzeni nazw, jeśli uwzględniono którykolwiek z powiązanych z nim nagłówków.
Żadne inne identyfikatory nie są zastrzeżone. Jeśli program deklaruje lub definiuje identyfikator w kontekście, w którym jest zarezerwowany (inny niż dozwolony w 7.1.4), lub definiuje zastrzeżony identyfikator jako nazwę makra, zachowanie jest niezdefiniowane.
Jeśli program usunie (z #undef
) dowolną definicją makra identyfikatora w pierwszej grupie wymienionej powyżej, zachowanie jest niezdefiniowane.
154) Lista zarezerwowanych identyfikatorów z zewnętrznym wiązaniem obejmuje errno
, math_errhandling
, setjmp
, i va_end
.
Mogą obowiązywać inne ograniczenia. Na przykład standard POSIX rezerwuje wiele identyfikatorów, które prawdopodobnie pojawią się w normalnym kodzie:
- Nazwy rozpoczynające się od dużej
E
litery następują po cyfrach lub wielkich literach:
- może być użyty do dodatkowych nazw kodów błędów.
- Nazwy, które zaczynają się na jedną
is
lub to
następują po niej małą literą
- może być wykorzystywany do dodatkowych funkcji testowania znaków i konwersji.
- Nazwy rozpoczynające się od,
LC_
po których następuje wielka litera
- może być użyty do dodatkowych makr określających atrybuty ustawień regionalnych.
- Nazwy wszystkich istniejących funkcji matematycznych z przyrostkiem
f
lub l
są zastrzeżone
- dla odpowiednich funkcji, które działają odpowiednio na liczbach zmiennoprzecinkowych i długich podwójnych argumentach.
- Nazwy zaczynające się
SIG
od dużej litery są zastrzeżone
- dla dodatkowych nazw sygnałów.
- Nazwy zaczynające się
SIG_
od dużej litery są zastrzeżone
- dla dodatkowych akcji sygnalizacyjnych.
- Nazwy rozpoczynające się od
str
, mem
lub wcs
poprzedzające małą literę są zastrzeżone
- dla dodatkowych funkcji łańcuchowych i tablicowych.
- Nazwy rozpoczynające się od
PRI
lub SCN
po każdej małej litery lub X
są zastrzeżone
- dla makr dodatkowego specyfikatora formatu
- Nazwy kończące się
_t
są zastrzeżone
- dla dodatkowych nazw typów.
Mimo ż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.