Las reglas (que no cambiaron en C ++ 11):
- Reservado en cualquier ámbito, incluso para su uso como implementación macros de :
- identificadores que comienzan con un guión bajo seguido inmediatamente por una letra mayúscula
- identificadores que contienen guiones bajos adyacentes (o "guión bajo doble")
- Reservado en el espacio de nombres global:
- identificadores que comienzan con un guión bajo
- Además, todo en el
std
espacio de nombres está reservado. (Sin embargo, puede agregar especializaciones de plantilla).
Del 2003 C ++ Standard:
17.4.3.1.2 Nombres globales [lib.global.names]
Ciertos conjuntos de nombres y firmas de funciones siempre están reservados para la implementación:
- Cada nombre que contiene un guión bajo doble (
__
) o que comienza con un guión bajo seguido de una letra mayúscula (2.11) está reservado a la implementación para cualquier uso.
- Cada nombre que comienza con un guión bajo está reservado a la implementación para su uso como nombre en el espacio de nombres global. 165
165) Tales nombres también están reservados en el espacio de nombres ::std
(17.4.3.1).
Debido a que C ++ se basa en el estándar C (1.1 / 2, C ++ 03) y C99 es una referencia normativa (1.2 / 1, C ++ 03), esto también se aplica, desde el Estándar C de 1999:
7.1.3 Identificadores reservados
Cada encabezado declara o define todos los identificadores enumerados en su subcláusula asociada, y opcionalmente declara o define los identificadores enumerados en su subcláusula e identificadores de direcciones de biblioteca futuros asociados que siempre están reservados para cualquier uso o como identificadores de alcance de archivo.
- Todos los identificadores que comienzan con un guión bajo y una letra mayúscula u otro guión bajo siempre están reservados para cualquier uso.
- Todos los identificadores que comienzan con un guión bajo siempre están reservados para su uso como identificadores con alcance de archivo en los espacios de nombre ordinario y de etiqueta.
- Cada nombre de macro en cualquiera de las siguientes subcláusulas (incluidas las futuras instrucciones de la biblioteca) está reservado para su uso tal como se especifica si se incluye alguno de sus encabezados asociados; a menos que se indique explícitamente lo contrario (ver 7.1.4).
- Todos los identificadores con enlace externo en cualquiera de las siguientes subcláusulas (incluidas las futuras instrucciones de la biblioteca) siempre están reservados para su uso como identificadores con enlace externo. 154
- Cada identificador con alcance de archivo enumerado en cualquiera de las siguientes subcláusulas (incluidas las futuras instrucciones de la biblioteca) está reservado para su uso como nombre de macro y como identificador con alcance de archivo en el mismo espacio de nombre si se incluye alguno de sus encabezados asociados.
No hay otros identificadores reservados. Si el programa declara o define un identificador en un contexto en el que está reservado (aparte de lo permitido por 7.1.4), o define un identificador reservado como un nombre de macro, el comportamiento es indefinido.
Si el programa elimina (con #undef
) cualquier definición de macro de un identificador en el primer grupo mencionado anteriormente, el comportamiento es indefinido.
154) la lista de identificadores reservados con enlace externo incluye errno
, math_errhandling
, setjmp
, y va_end
.
Se pueden aplicar otras restricciones. Por ejemplo, el estándar POSIX reserva muchos identificadores que pueden aparecer en el código normal:
- Nombres que comienzan con mayúscula
E
siguen un dígito o una letra mayúscula:
- puede usarse para nombres de códigos de error adicionales.
- Nombres que comienzan con
is
oto
seguidos de una letra minúscula
- puede usarse para pruebas de caracteres adicionales y funciones de conversión.
- Nombres que comienzan con
LC_
seguidos de una letra mayúscula
- puede usarse para macros adicionales que especifican atributos locales.
- Los nombres de todas las funciones matemáticas existentes con sufijo
f
o l
están reservados
- para funciones correspondientes que operan en flotante y argumentos dobles largos, respectivamente.
- Los nombres que comienzan
SIG
seguidos de una letra mayúscula están reservados.
- para nombres de señal adicionales.
- Nombres que comienzan con
SIG_
seguidos de una letra mayúscula están reservados.
- para acciones de señal adicionales.
- Nombres que comienzan con
str
, mem
owcs
seguidos de una letra minúscula están reservados
- para funciones adicionales de cadena y matriz.
- Nombres que comienzan con
PRI
o SCN
seguidos de cualquier letra minúscula oX
están reservados
- para macros de especificador de formato adicionales
- Los nombres que terminan con
_t
están reservados
- para nombres de tipo adicionales.
Si bien el uso de estos nombres para sus propios fines en este momento puede no causar un problema, aumentan la posibilidad de conflicto con futuras versiones de ese estándar.
Personalmente, simplemente no comienzo identificadores con guiones bajos. Nueva adición a mi regla: no use guiones bajos dobles en ningún lado, lo cual es fácil ya que rara vez uso guiones bajos.
Después de investigar este artículo, ya no termino con mis identificadores _t
ya que está reservado por el estándar POSIX.
La regla sobre cualquier identificador que termina con _t
me sorprendió mucho. Creo que es un estándar POSIX (aún no estoy seguro) en busca de aclaraciones y capítulos y versículos oficiales. Esto es del manual GNU libtool , que enumera los nombres reservados.
CesarB proporcionó el siguiente enlace a los símbolos y notas reservados POSIX 2004 "que muchos otros prefijos y sufijos reservados ... se pueden encontrar allí". Los
símbolos reservados POSIX 2008 se definen aquí. Las restricciones son algo más matizadas que las anteriores.