c++ c++11 language-lawyer identifier

¿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:

  1. No puede comenzar con un número.
  2. Puede estar compuesto por letras, números, guiones bajos, nombres de caracteres universales y caracteres definidos por implementación
  3. 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.