¿C++ 11 permite signos de dólar en identificadores?
auto c++ (2)
¿Se permiten los signos de dólar en los identificadores en C ++ 03? cubre que los signos de dólar en los identificadores no están permitidos en C ++ 03. GCC lo proporciona como una extensión C y proporciona correctamente un diagnóstico en el modo C ++ 03. Sin embargo, en C ++ 11, int $ = 0
se compilará sin avisar.
Esta answer explica que se puede permitir $
porque no se requiere ningún diagnóstico para los identificadores definidos de la implementación:
La respuesta aquí es "Tal vez" : De acuerdo con §2.11 , los identificadores pueden consistir en dígitos e identificadores-no-dígitos , comenzando con uno de los últimos. identifier-nondigits son los
az
,AZ
y subrayado habituales, además, desde C ++ 11 incluyen nombres de caracteres universales (por ejemplo,/uBEAF
,/UC0FFEE32
) y otros caracteres definidos por la implementación . Por lo tanto, se define la implementación si se permite usar$
en un identificador. VC10 y versiones superiores lo admiten, tal vez versiones anteriores también. Incluso admite identificadores comoこんばんわ
.Pero: no los usaría. Haga que los identificadores sean lo más legibles y portátiles posible.
$
es la implementación definida y por lo tanto no es portátil.
Este lenguaje también está presente en el estándar C ++ 03, por lo que no creo que este sea un argumento muy convincente.
§2.10 / 2
Además, algunos identificadores están reservados para su uso por las implementaciones de C ++ y las bibliotecas estándar (17.6.4.3.2) y no se usarán de otro modo; no se requiere diagnóstico
¿Qué cambio en el estándar permite que $
sea usado como un nombre de identificador?
Este es un comportamiento definido por la implementación, $
no está incluido en la gramática para identificadores. Las reglas para los nombres de identificadores en C ++ 11 son:
- No puede comenzar con un número.
- Puede estar compuesto por letras, números, guiones bajos, nombres de caracteres universales y caracteres definidos por implementación
- No puede ser una keyword
Se permiten los caracteres definidos por la implementación y muchos compiladores admiten como una extensión, incluidos gcc , clang
, Visual Studio y como se indica en un comment aparentemente los compiladores DEC C ++ .
La gramática se trata en el borrador del estándar de C ++, sección 2.11
Indentificador . Agregué notas adicionales que comienzan con <-
:
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
[...]
Si -pedantic-errors
este código usando el clang
con la -pedantic-errors
, no se compilará:
int $ = 0
y genera el siguiente error:
error: ''$'' in identifier [-Werror,-Wdollar-in-identifier-extension]
int $ = 0;
^
No lo creo. El signo de dólar se encuentra en ASCII 0x24, que no se encuentra dentro de ninguno de los rangos definidos en el apéndice E.1 (nombre del personaje permitido) del estándar. Y como no es ni un dígito ni un no dígito, debe ser un carácter definido por la implementación. Estoy de acuerdo en que esto no es portátil C ++ 11. También tenga en cuenta que un identificador no debe comenzar con un carácter universal, mientras que sí permite que un identificador comience con un carácter permitido por la implementación.