2013-09-05 36 views

risposta

11

Un nome (identificativo) è costituito da una sequenza di lettere e cifre. Il primo carattere del deve essere una lettera. Il carattere di sottolineatura, _, è considerato una lettera.

Dal linguaggio di programmazione C++, 4a edizione.

+4

È possibile dedurre da quella citazione che la risposta è "sì", ma sarebbe bello dirlo. –

11

Secondo Stroustrup (3a edizione, sezione 4.9.3), un identificativo è costituito da una sequenza di lettere e cifre. Il primo carattere deve essere una lettera. Il carattere di sottolineatura è considerato una lettera.

Quindi, sì, dovrebbe essere portatile.

+2

Sconfiggili di 2 secondi! –

+0

Inoltre, nello [standard C++] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf) (2.11). – nickie

3

Sì. un singolo _ sarà accettato come variabile o qualsiasi nome identificatore/spazio dei nomi! Per esempio. google mock utilizza questo.

+0

Boost.MPL troppo. http://www.boost.org/doc/libs/1_54_0/libs/mpl/doc/refmanual/placeholders.html –

0

Sì, è un prefisso valido. Esecuzione

#include <iostream> 

using namespace std; 

int main() 
{ 
char* _ = "Hello World"; 
cout << _ << endl; 
return 0; 
} 

stampe fuori "Ciao Mondo" come previsto. Non è un nome varible molto utile ma è valido

+3

La compilazione o esecuzione non garantisce la conformità agli standard o la portabilità. –

+1

@WayneMcGee: A meno che tu non abbia accesso a LOTS di compilatori [anche se è probabile che fallisca o abbia successo in qualche compilatore quando dovrebbe accadere l'opposto], o chiedi al compilatore di essere severo sugli standard [e di nuovo, la severità può essere soggetta ai bug del compilatore]. –

7

Sì, _ è un identificatore valido, poiché soddisfa i requisiti di sintassi. Fondamentalmente, un identificatore è costituito da un trattino basso o una lettera, seguito da zero o più caratteri che possono essere caratteri di sottolineatura, lettere o cifre. (A partire da C++ 2011, gli identificatori possono anche contenere nomi di caratteri universali e altri caratteri definiti dall'implementazione, ma ciò non è pertinente alla tua domanda.)

Ma probabilmente non è uno che dovresti usare nel tuo codice, a meno che tu non sia " stai molto attento.

Come this answer dice, citando lo standard C++ 2003:

Ogni nome che inizia con un carattere di sottolineatura è riservata alla implementazione per l'uso come un nome nel namespace globale.

La variabile _ non è nel namespace globale, così sei sicuro in questo caso, ma è una buona idea per evitare di definire eventuali identificatori che iniziano con un carattere di sottolineatura.

Inoltre, credo che GNU gettext (che fornisce supporto per i messaggi localizzati) utilizza il nome _ per i propri scopi. (È stata probabilmente una cattiva idea per GNU gettext fare a questo, ma è stata una scelta conveniente.)

+0

Questa convenzione (gettext di GNU) non è in conflitto con le regole di denominazione C++? Ho letto che i nomi globali * che iniziano * con un carattere di sottolineatura sono vietati? – Wolf

+1

@Wolf: Non sono esattamente * vietati *, ma sono riservati. Sì, credo che l'uso di gettext di '_' viola i requisiti sia di C che di C++ - ma finché l'implementazione non usa effettivamente' _', non è probabile che causi problemi reali. –