2012-01-01 18 views
8

Secondo le specifiche, i nomi globali con i principali sottolineatura non sono ammessi:I nomi all'interno di uno spazio dei nomi anonimo nell'ambito globale hanno caratteri di sottolineatura principali?

17.4.3.1.2 nomi globali
- Ogni nome che inizia con un carattere di sottolineatura è riservata alla realizzazione per l'uso come un nome in lo spazio dei nomi globale.

Questo vale anche per i nomi definiti in uno spazio dei nomi anonimo di livello superiore?

+0

Al MEGLIO, sarebbe davvero una forma davvero scadente se si decidesse di utilizzare i trattini di sottolineatura principali su uno qualsiasi dei nomi delle variabili. – paulsm4

+1

@ paulsm4 Questo è ciò che fa la libreria boost bind per definire i segnaposti degli argomenti ('_1',' _2', ecc ...). – StackedCrooked

+2

Uno spazio dei nomi senza nome non è particolarmente speciale; è solo uno spazio dei nomi ordinario, con nomi univoci con una direttiva implicita che inietta i suoi nomi nello spazio dei nomi che lo racchiude. Tuttavia, vi è una domanda interessante qui: un nome inserito nel namespace globale tramite una direttiva using viola questa regola? –

risposta

3

Sì. Ma quella citazione non si rivolge a questo (come tu lo sai da solo).

Ecco cosa penso si applica a quella:

17.4.3.1.3 collegamento esterno

3. Ogni nome con due trattini di sottolineatura consecutivi (2.11) è riservato all'implementazione da utilizzare come nome con entrambi i collegamenti extern "C" ed extern "C++".

penso che si applica alle variabili dichiarate con collegamento esterno, nel namespace anonimo, ma si deve ricordare che si parla di doppie sottolineatura. Quindi:

namespace 
{ 
    std::string __s1; //not allowed 
    std::string _s2; //allowed (allowed, as I understand) 
} 

Un tema più generale:

+0

Inoltre, 'std :: string _S3;' non sarebbe consentito. –

+0

@JamesMcNellis: vuoi dire che '_s2' è permesso, ma' _S3' non lo è (enfatizzando la maiuscola)? Quale affermazione della specifica lo vieta? – Nawaz

+0

Vedere il primo punto elenco nella prima citazione nella risposta accettata della domanda a cui si collega. –

6

nomi che iniziano con un underscore seguito da un carattere alfanumerico non-capitale e che non possiedono la doppia sottolineatura sono riservati solo nel namespace globale. La ragione di ciò è che su alcuni sistemi alcuni nomi devono ottenere un trattino di sottolineatura principale o sono già utilizzati dal sistema operativo sottostante e/o dalla sua libreria C. I nomi in uno spazio dei nomi anonimo non hanno questo problema.

Detto questo, mi chiedo sempre perché le persone sono così ansiose di usare nomi brutti! A meno che non sia nella modalità di implementazione della libreria standard (dove effettivamente devo usare nomi brutti per non entrare in conflitto con i nomi degli utenti) mi chiedo sempre se sto facendo qualcosa di sbagliato usando un trattino basso principale in qualsiasi parte del mio codice! Vi sono rare occasioni in cui è necessario un trattino di sottolineatura principale (ad esempio quando si chiama _exit() o utilizzando i segnaposto di std::bind()) ma in genere gli utenti non devono toccarli: non li usano né li definiscono.

+2

Concordo pienamente con il sentimento espresso qui. '+ 1' da me, mi è capitato di sapere che la domanda è nata da una discussione nella [chat room C++] (http://chat.stackoverflow.com/rooms/10/loungec), non perché Stacked intendeva usare quei nomi, ma poiché tali domande sono viste da migliaia di altri utenti, trovo importante menzionarlo almeno. – sbi

Problemi correlati