Le regole (che non sono cambiate in C ++ 11):
- Riservato in qualsiasi ambito, incluso l'uso come implementazione macro di :
- identificatori che iniziano con un trattino basso seguito immediatamente da una lettera maiuscola
- identificatori contenenti caratteri di sottolineatura adiacenti (o "doppio trattino basso")
- Riservato nello spazio dei nomi globale:
- identificatori che iniziano con un trattino basso
- Inoltre, tutto nello
std
spazio dei nomi è riservato. (Tuttavia, puoi aggiungere le specializzazioni dei modelli.)
Dallo standard C ++ del 2003:
17.4.3.1.2 Nomi globali [lib.global.names]
Alcuni insiemi di nomi e firme di funzioni sono sempre riservati all'implementazione:
- Ogni nome che contiene un carattere di sottolineatura doppio (
__
) o inizia con un carattere di sottolineatura seguito da una lettera maiuscola (2.11) è riservato all'implementazione per qualsiasi uso.
- Ogni nome che inizia con un carattere di sottolineatura è riservato all'implementazione per l'uso come nome nello spazio dei nomi globale. 165
165) Tali nomi sono anche riservati nello spazio dei nomi ::std
(17.4.3.1).
Poiché il C ++ si basa sullo standard C (1.1 / 2, C ++ 03) e C99 è un riferimento normativo (1.2 / 1, C ++ 03), questi si applicano anche dallo standard C del 1999:
7.1.3 Identificatori riservati
Ogni intestazione dichiara o definisce tutti gli identificatori elencati nella sua sotto-clausola associata e, facoltativamente, dichiara o definisce gli identificatori elencati nella sua sottoclausola e identificatori di direzioni della biblioteca associati associati che sono sempre riservati per qualsiasi uso o per l'uso come identificatori di ambito di file.
- Tutti gli identificatori che iniziano con un carattere di sottolineatura e una lettera maiuscola o un altro carattere di sottolineatura sono sempre riservati per qualsiasi uso.
- Tutti gli identificatori che iniziano con un carattere di sottolineatura sono sempre riservati per l'uso come identificatori con ambito di file negli spazi dei nomi ordinari e dei tag.
- Ciascun nome di macro in uno dei seguenti sottoclausi (comprese le future istruzioni della libreria) è riservato per l'uso come specificato se è inclusa una delle intestazioni associate; se non diversamente specificato (vedere 7.1.4).
- Tutti gli identificatori con collegamento esterno in uno dei seguenti sottoclausi (comprese le future direzioni della biblioteca) sono sempre riservati per l'uso come identificatori con collegamento esterno. 154
- Ogni identificatore con ambito di file elencato in uno dei seguenti sottoclausi (comprese le direzioni future della libreria) è riservato per l'uso come nome di macro e come identificatore con ambito di file nello stesso spazio dei nomi se è inclusa una delle intestazioni associate.
Nessun altro identificatore è riservato. Se il programma dichiara o definisce un identificatore in un contesto in cui è riservato (diverso da quello consentito dalla 7.1.4) o definisce un identificatore riservato come nome di macro, il comportamento non è definito.
Se il programma rimuove (con #undef
) qualsiasi definizione macro di un identificatore nel primo gruppo sopra elencato, il comportamento non è definito.
154) L'elenco degli identificatori riservati con collegamento esterno comprende errno
, math_errhandling
, setjmp
, e va_end
.
Potrebbero essere applicate altre restrizioni. Ad esempio, lo standard POSIX riserva molti identificatori che potrebbero essere visualizzati nel codice normale:
- I nomi che iniziano con la maiuscola hanno
E
seguito una cifra o una lettera maiuscola:
- può essere utilizzato per nomi di codici di errore aggiuntivi.
- Nomi che iniziano con
is
oto
seguiti da una lettera minuscola
- può essere utilizzato per ulteriori funzioni di test e conversione dei caratteri.
- Nomi che iniziano con
LC_
seguito da una lettera maiuscola
- può essere utilizzato per macro aggiuntive che specificano gli attributi della locale.
- I nomi di tutte le funzioni matematiche esistenti sono stati aggiunti
f
o l
riservati
- per le funzioni corrispondenti che operano rispettivamente su float e long double argomenti.
- I nomi che iniziano con
SIG
seguito da una lettera maiuscola sono riservati
- per nomi di segnali aggiuntivi.
- I nomi che iniziano con
SIG_
seguito da una lettera maiuscola sono riservati
- per ulteriori azioni di segnale.
- I nomi che iniziano con
str
, mem
o wcs
seguiti da una lettera minuscola sono riservati
- per funzioni aggiuntive di stringa e matrice.
- Nomi che iniziano con
PRI
o SCN
seguiti da una lettera minuscola oX
sono riservati
- per ulteriori macro identificatore di formato
- I nomi che terminano con
_t
sono riservati
- per nomi di tipi aggiuntivi.
Mentre usare questi nomi per i tuoi scopi in questo momento potrebbe non causare problemi, aumentano la possibilità di conflitto con le versioni future di quello standard.
Personalmente, non avvio identificatori con caratteri di sottolineatura. Nuova aggiunta alla mia regola: non usare i caratteri di sottolineatura doppi da nessuna parte, il che è facile poiché uso raramente il trattino basso.
Dopo aver fatto delle ricerche su questo articolo, non finisco più con i miei identificatori _t
poiché questo è riservato dallo standard POSIX.
La regola su qualsiasi identificatore che termina con _t
mi ha sorpreso molto. Penso che sia uno standard POSIX (non ancora sicuro) in cerca di chiarimenti e capitolo e verso ufficiali. Questo è dal manuale GNU libtool , che elenca i nomi riservati.
CesarB ha fornito il seguente link ai simboli riservati di POSIX 2004 e osserva "che molti altri prefissi e suffissi riservati ... possono essere trovati lì". I
simboli riservati di POSIX 2008 sono definiti qui. Le restrizioni sono leggermente più sfumate rispetto a quelle sopra.