2014-10-10 14 views
17

Are dollar-signs allowed in identifiers in C++03? copre che i segni di dollaro negli identificatori non sono consentiti in C++ 03. GCC lo fornisce come C extension e fornisce correttamente una diagnostica in modalità C++ 03. Tuttavia, in C++ 11, int $ = 0 verrà compilato senza preavviso.C++ 11 consente la presenza di segni di dollaro negli identificatori?

Questo answer ragioni che $ può essere ammessa perché nessuno diagnostica è richiesto per gli identificatori di implementazione definita:

The answer here is "Maybe": According to §2.11, identifiers may consist of digits and identifier-nondigits, starting with one of the latter. identifier-nondigits are the usual a-z , A-Z and underscore, in addition since C++11 they include universal-character-names (e.g. \uBEAF , \UC0FFEE32), and other implementation-defined characters. So it is implementation defined if using $ in an identifier is allowed. VC10 and up supports that, maybe earlier versions, too. It even supports identifiers like こんばんわ .

But: I wouldn't use them. Make identifiers as readable and portable as possible. $ is implementation defined and thus not portable.

Questo linguaggio è presente nello standard C++ 03 e, in modo non trovo questo essere un argomento molto convincente.

§2.10/2

In addition, some identifiers are reserved for use by C++ implementations and standard libraries (17.6.4.3.2) and shall not be used otherwise; no diagnostic is required.

Quale cambiamento nella norma consente $ per essere usato come un nome di identificatore?

+2

Clang avvisa su questo. –

+0

@Shafik Abbastanza confusamente questo [answer] (http://stackoverflow.com/a/14595459/3920237) collega alla vecchia documentazione di gcc che dice esplicitamente che C++ proibisce '$' negli identificatori. L'hanno spostato su [opzioni del preprocessore] (https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html # Preprocessore-Opzioni) con la sola descrizione 'Accetta '$' negli identificatori. –

+0

Storicamente, DEC utilizzava $ in tutti i suoi servizi di sistema e nomi di funzioni di libreria con $$ in tutte le sue funzioni interne. Tutti i compilatori DEC o estensioni che consentono nomi di simboli $ o pragma per la mappatura (come con ADA). – user3344003

risposta

17

Questo comportamento definito dall'implementazione, $ non è incluso nella grammatica per gli identificatori. Le regole per i nomi di identificatore in C++ 11 sono:

  1. non può iniziare con un numero
  2. può essere composto da lettere, numeri, sottolineano, i nomi dei personaggi universali e implementazione definiti caratteri
  3. non può essere un keyword

caratteri definiti dall'implementazione sono ammessi e molti compilatore s supporto come estensione, incluso gcc, clang, Visual Studio e come indicato in un comment apparentemente DEC C++ compilers.

La grammatica è coperto nella sezione draft C++ standard2.11Indentifier, ho aggiunto note aggiuntive a partire <-:

identifier: 
    identifier-nondigit   <- Can only start with a non-digit 
    identifier identifier-nondigit <- Next two rules allows for subsequent 
    identifier digit    <- characters to be those outlined in 2 above 
identifier-nondigit: 
    nondigit      <- a-z, A-Z and _ 
    universal-character-name 
    other implementation-defined characters 
[...] 

Se si compila il codice utilizzando clang con la bandiera -pedantic-errors non si compila:

int $ = 0 

e genera il seguente errore:

error: '$' in identifier [-Werror,-Wdollar-in-identifier-extension] 
int $ = 0; 
    ^
3

Non credo. Il simbolo del dollaro è in ASCII 0x24, che non si trova all'interno degli intervalli definiti nell'appendice E.1 (charname.allowed) dello standard. E dal momento che non è né cifra né nondigit, deve essere un carattere definito dall'implementazione. Sono d'accordo quindi che questo non è portatile C++ 11. Si noti inoltre che un identificatore non deve iniziare con un carattere universale, mentre consente a un identificatore di iniziare con un carattere consentito dall'implementazione.

+1

"Not portable" e "not allowed" (male formato) sono entrambe cose brutte, ma non uguali. Quindi questa non è una risposta diretta alla domanda. – MSalters

+1

Ne sono ben consapevole. Ho usato "not portable" come sinonimo di "comportamento definito dall'implementazione" qui. – dom0

Problemi correlati