teclado reglas programación programacion poner para nombre nombrar lenguaje laptop guion escribir escribe computadora como bajo arroba c++ standards underscores c++-faq

programación - ¿Cuáles son las reglas sobre el uso de un guión bajo en un identificador de C++?



reglas para nombrar variables en programación (5)

Desde MSDN :

El uso de dos caracteres de subrayado secuenciales (__) al comienzo de un identificador, o un subrayado inicial único seguido de una letra mayúscula, está reservado para implementaciones de C ++ en todos los ámbitos. Debe evitar el uso de un guión bajo seguido de una letra minúscula para los nombres con alcance de archivo debido a posibles conflictos con los identificadores reservados actuales o futuros.

Esto significa que puede usar un solo guión bajo como un prefijo de variable miembro, siempre que esté seguido de una letra minúscula.

Aparentemente, esto está tomado de la sección 17.4.3.1.2 del estándar C ++, pero no puedo encontrar una fuente original para el estándar completo en línea.

Véase también esta pregunta .

Es común en C ++ nombrar variables miembro con algún tipo de prefijo para denotar el hecho de que son variables miembro, en lugar de variables o parámetros locales. Si has venido de un fondo MFC, probablemente m_foo . También he visto myFoo ocasionalmente.

C # (o posiblemente solo .NET) parece recomendar usar solo un guión bajo, como en _foo . ¿Está esto permitido por el estándar C ++?


En cuanto a la otra parte de la pregunta, es común poner el subrayado al final del nombre de la variable para que no choque con nada interno.

Hago esto incluso dentro de las clases y los espacios de nombres porque entonces solo tengo que recordar una regla (en comparación con "al final del nombre en el ámbito global, y al principio del nombre en cualquier otro lugar").


Las reglas (que no cambiaron en C ++ 11):

  • Reservado en cualquier ámbito, incluso para su uso como macros de implementation :
    • identificadores que comienzan con un guión bajo seguido inmediatamente por una letra mayúscula
    • identificadores que contienen guiones bajos adyacentes (o "subrayado doble")
  • Reservado en el espacio de nombres global:
    • identificadores que comienzan con un guión bajo
  • Además, todo en el std nombres std está reservado. (Sin embargo, está permitido agregar especializaciones de plantillas).

Desde el estándar C ++ 2003:

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 doble guión bajo ( __ ) o 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 un nombre en el espacio de nombres global. 165

165) Tales nombres también se reservan en namespace ::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), estos también se aplican, a partir del 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 identificadores enumerados en sus subclausas de direcciones de bibliotecas futuras asociadas e identificadores que siempre están reservados para cualquier uso o para uso 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 se reservan para cualquier uso.
  • Todos los identificadores que comienzan con un guión bajo siempre se reservan 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 direcciones futuras de la biblioteca) se reserva para su uso como se especifica si se incluye alguno de sus encabezados asociados; a menos que se indique explícitamente lo contrario (véase 7.1.4).
  • Todos los identificadores con enlace externo en cualquiera de las siguientes subcláusulas (incluidas las direcciones futuras de la biblioteca) siempre se reservan para su uso como identificadores con enlace externo. 154
  • Cada identificador con el alcance del archivo listado en cualquiera de las siguientes subcláusulas (incluidas las direcciones futuras de la biblioteca) se reserva para su uso como nombre de macro y como identificador con el alcance del 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 no está definido.

Si el programa elimina (con #undef ) cualquier definición de macro de un identificador en el primer grupo mencionado anteriormente, el comportamiento no está definido.

154) La lista de identificadores reservados con enlace externo incluye errno , math_errhandling , setjmp y va_end .

Otras restricciones pueden aplicar. Por ejemplo, el estándar POSIX reserva una gran cantidad de identificadores que probablemente aparezcan en el código normal:

  • Los nombres que comienzan con una E mayúscula siguen un dígito o una letra mayúscula:
    • Puede ser usado para nombres de códigos de error adicionales.
  • Los nombres que comienzan con cualquiera de las dos is seguidos por 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
    • se puede utilizar para macros adicionales que especifican atributos de configuración regional.
  • Los nombres de todas las funciones matemáticas existentes con el sufijo f o l están reservados
    • para las funciones correspondientes que operan en float y argumentos dobles largos, respectivamente.
  • Los nombres que comienzan con SIG seguidos de una letra mayúscula están reservados
    • para nombres de señales adicionales.
  • Los nombres que comienzan con SIG_ seguidos de una letra mayúscula están reservados
    • para acciones de señal adicionales.
  • Los nombres que comienzan con str , mem o wcs seguidos de una letra minúscula están reservados
    • para cadenas adicionales y funciones de matriz.
  • Los nombres que comienzan con PRI o SCN seguidos de cualquier letra minúscula o X están reservados
    • para macros especificador de formato adicional
  • 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, plantean la posibilidad de conflicto con las versiones futuras de ese estándar.

Personalmente simplemente no comienzo identificadores con guiones bajos. Nueva adición a mi regla: no use guiones bajos en ninguna parte, lo cual es fácil ya que rara vez uso guión bajo.

Después de investigar este artículo, ya no _t mis identificadores con _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) que busca aclaraciones y capítulos y versos oficiales. Esto es del manual libtool de GNU , listando nombres reservados.

CesarB proporcionó el siguiente enlace a los símbolos y notas reservados de opengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html "donde se pueden encontrar muchos otros prefijos y sufijos reservados ...". Los símbolos reservados POSIX 2008 se definen aquí. Las restricciones son algo más matizadas que las anteriores.


Las reglas para evitar la colisión de nombres se encuentran en el estándar de C ++ (consulte el libro de Stroustrup) y las mencionan los gurús de C ++ (Sutter, etc.).

Regla personal

Como no quería tratar los casos y quería una regla simple, diseñé una personal que es simple y correcta a la vez:

Al nombrar un símbolo, evitará la colisión con el compilador / SO / bibliotecas estándar si:

  • Nunca comience un símbolo con un guión bajo
  • nunca nombre un símbolo con dos guiones bajos consecutivos dentro.

Por supuesto, poner tu código en un espacio de nombres único también ayuda a evitar colisiones (pero no protegerá contra macros malignas)

Algunos ejemplos

(Yo uso macros porque son los que más contaminan el código de los símbolos C / C ++, pero podría ser cualquier cosa, desde el nombre de la variable hasta el nombre de la clase)

#define _WRONG #define __WRONG_AGAIN #define RIGHT_ #define WRONG__WRONG #define RIGHT_RIGHT #define RIGHT_x_RIGHT

Extractos del borrador de C ++ 0x

Del archivo n3242.pdf (espero que el texto estándar final sea similar):

17.6.3.3.2 Nombres globales [global.names]

Ciertos conjuntos de nombres y firmas de funciones siempre están reservados para la implementación:

- Cada nombre que contiene un doble guión bajo __ o comienza con un guión bajo seguido de una letra mayúscula (2.12) 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 un nombre en el espacio de nombres global.

Pero también:

17.6.3.3.5 Sufijos literales definidos por el usuario [usrlit.suffix]

Los identificadores de sufijo literales que no comienzan con un guión bajo se reservan para una futura estandarización.

Esta última cláusula es confusa, a menos que considere que un nombre que comience con un guión bajo y que esté seguido de una letra minúscula estaría bien si no estuviera definido en el espacio de nombres global ...


Sí, los guiones bajos se pueden utilizar en cualquier parte de un identificador. Creo que las reglas son: cualquiera de az, AZ, _ en el primer carácter y esos + 0-9 para los siguientes caracteres.

Los prefijos de guión bajo son comunes en el código C: un guión bajo significa "privado", y los guiones bajos suelen estar reservados para que los utilice el compilador.