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

945
Roger Lipscombe 2008-10-23 21:02.

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 tiene experiencia en MFC, probablemente use m_foo. También he visto de vez en myFoocuando.

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

5 answers

868

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

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

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 guión bajo doble ( __) 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 se reserva para la implementación para su uso como nombre en el espacio de nombres global. 165

165) Dichos 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), también se aplican, 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 los identificadores enumerados en su subcláusula de instrucciones de biblioteca futura asociada e identificadores que siempre están reservados para cualquier uso o para su 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 están siempre reservados 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 instrucciones 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 (ver 7.1.4).
  • Todos los identificadores con enlace externo en cualquiera de las siguientes subcláusulas (incluidas las instrucciones futuras 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 instrucciones futuras 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 se reservan otros identificadores. Si el programa declara o define un identificador en un contexto en el que está reservado (distinto al 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 enumerado anteriormente, el comportamiento no está definido.

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

Pueden aplicarse otras restricciones. Por ejemplo, el estándar POSIX reserva una gran cantidad de identificadores que es probable que aparezcan en el código normal:

  • Los nombres que comienzan con mayúscula Evan seguidos de un dígito o una letra mayúscula:
    • se puede utilizar para nombres de códigos de error adicionales.
  • Nombres que comienzan con iso toseguidos de una letra minúscula
    • se puede utilizar 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.
  • Nombres de todas las funciones matemáticas existentes con sufijo fo lestán reservados
    • para las funciones correspondientes que operan en argumentos dobles flotantes y largos, respectivamente.
  • Los nombres que comienzan con SIGseguidos de una letra mayúscula están reservados.
    • para obtener 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, memo wcsseguidos de una letra minúscula están reservados.
    • para funciones adicionales de cadena y matriz.
  • Los nombres que comienzan con PRIo SCNseguidos de cualquier letra minúscula o Xestán reservados
    • para macros de especificador de formato adicionales
  • Los nombres que terminan con _testán reservados
    • para obtener nombres de tipos adicionales.

Si bien el uso de estos nombres para sus propios fines en este momento podría no causar un problema, sí plantean la posibilidad de conflictos con versiones futuras de ese estándar.


Personalmente, simplemente no comienzo los identificadores con guiones bajos. Nueva adición a mi regla: no use guiones bajos dobles en ningún lugar, lo cual es fácil ya que rara vez uso guiones bajos.

Después de investigar este artículo, ya no termino mis identificadores con _testo, ya que está reservado por el estándar POSIX.

La regla sobre cualquier identificador que termine en _tme 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 , que enumera los nombres reservados.

CesarB proporcionó el siguiente enlace a los símbolos y notas reservados de 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.

202
paercebal 2008-10-23 21:27.

Las reglas para evitar la colisión de nombres están tanto en el estándar C ++ (ver el libro Stroustrup) como mencionadas por los gurús de C ++ (Sutter, etc.).

Regla personal

Como no quería ocuparme de casos y quería una regla simple, he diseñado una personal que es a la vez simple y correcta:

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

  • nunca empiece un símbolo con un guión bajo
  • nunca nombre un símbolo con dos guiones bajos consecutivos adentro.

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

Algunos ejemplos

(Utilizo macros porque son los símbolos de C / C ++ que más contaminan el código, 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 C ++ 0x

Desde el 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 contenga un subrayado doble _ _ o comience con un subrayado 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 se reserva para la implementación para su uso como 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 sufijos literales que no comienzan con un guión bajo están reservados 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 seguido de una letra minúscula estaría bien si no se define en el espacio de nombres global ...

40
Roger Lipscombe 2008-10-23 21:06.

Desde MSDN :

El uso de dos caracteres de subrayado secuenciales (__) al comienzo de un identificador, o un único subrayado inicial seguido de una letra mayúscula, está reservado para las implementaciones de C ++ en todos los ámbitos. Debe evitar el uso de un guión bajo inicial 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 prefijo de variable miembro, siempre que esté seguido de una letra minúscula.

Aparentemente, esto se tomó 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.

Vea también esta pregunta .

25
Max Lybbert 2008-11-15 10:03.

En cuanto a la otra parte de la pregunta, es común colocar el guión bajo al final del nombre de la variable para no chocar con nada interno.

Hago esto incluso dentro de clases y espacios de nombres porque luego solo tengo que recordar una regla (en comparación con "al final del nombre en el alcance global y el comienzo del nombre en cualquier otro lugar").

1
John Millikin 2008-10-23 21:05.

Sí, los guiones bajos se pueden usar en cualquier lugar 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 subrayado son comunes en el código C: un solo subrayado significa "privado", y los dobles subrayados generalmente se reservan para que los use el compilador.

MORE COOL STUFF

La estrella de HGTV, Christina Hall, revela que tiene 'envenenamiento por mercurio y plomo' probablemente por voltear 'casas asquerosas'

La estrella de HGTV, Christina Hall, revela que tiene 'envenenamiento por mercurio y plomo' probablemente por voltear 'casas asquerosas'

La estrella de HGTV, Christina Hall, revela que le diagnosticaron envenenamiento por mercurio y plomo, probablemente debido a su trabajo como manipuladora de casas.

La estrella de 'Love Is Blind' Brennon Lemieux responde a los cargos de violencia doméstica

La estrella de 'Love Is Blind' Brennon Lemieux responde a los cargos de violencia doméstica

Recientemente salió a la luz un informe policial que acusa a la estrella de 'Love Is Blind', Brennon, de violencia doméstica. Ahora, Brennon ha respondido a los reclamos.

Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia Judd en un momento festivo de pánico

Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia Judd en un momento festivo de pánico

Conozca cómo Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia mientras organizaba la primera celebración de Acción de Gracias desde que murió su madre, Naomi Judd.

Experto en lenguaje corporal explica los 'paralelos' entre Kate Middleton y la princesa Diana

Experto en lenguaje corporal explica los 'paralelos' entre Kate Middleton y la princesa Diana

Descubra por qué un destacado experto en lenguaje corporal cree que es fácil trazar "tales paralelismos" entre la princesa Kate Middleton y la princesa Diana.

Los láseres arrojan luz sobre por qué necesita cerrar la tapa antes de descargar

Los láseres arrojan luz sobre por qué necesita cerrar la tapa antes de descargar

Los inodoros arrojan columnas de aerosol invisibles con cada descarga. ¿Como sabemos? La prueba fue capturada por láseres de alta potencia.

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

¿Caduca el repelente de insectos?

¿Caduca el repelente de insectos?

¿Sigue siendo efectivo ese lote de repelente de insectos que te quedó del verano pasado? Si es así, ¿por cuánto tiempo?

Estados Unidos podría evitarse el horror del nuevo gran horneado británico

Estados Unidos podría evitarse el horror del nuevo gran horneado británico

Si este tráiler de pesadilla de la temporada más reciente de Great British Bake Off te asustó y te hizo no volver a ver el programa, es posible que tengas suerte: PBS no ha decidido si se transmitirá o no la última temporada en los Estados Unidos. actualización, para aquellos que no siguen sin aliento este tipo de drama de nicho: el presentador Paul Hollywood y la hermosa carpa llena de batidoras de colores pastel y cuadros se trasladaron de la BBC al Canal 4; Mary Berry, Sue Perkins y Mel Giedroyc renunciaron.

Atún como Oh, Hello llega a Netflix

Atún como Oh, Hello llega a Netflix

Foto: Netflix Oh, Hello On Broadway (Netflix): Después de llegar a Broadway el año pasado, los dos locos del Upper West Side interpretados por John Mulaney y Nick Kroll finalmente llegaron a Netflix. El especial consta del espectáculo en el escenario, algunos momentos entre bastidores y un invitado muy especial de “Too Much Tuna”.

Actualice a un Sonicare por tan solo $ 30

Actualice a un Sonicare por tan solo $ 30

¿Quiere probar un cepillo de dientes Sonicare sin gastar mucho dinero en uno de sus modelos favoritos de gama alta? Puede comprar un kit de la Serie 2 o Serie 3 por tan solo $ 30 hoy en Amazon. Haga clic aquí para ver la lista completa de modelos elegibles y tenga en cuenta que se descontarán $ 10 adicionales en su carrito.

Ponle una tapa. En realidad, ponle una tapa a todo. Consigue 12 tapas de cocina elásticas de silicona por $14. [Exclusivo]

Ponle una tapa. En realidad, ponle una tapa a todo. Consigue 12 tapas de cocina elásticas de silicona por $14. [Exclusivo]

Tapas elásticas de silicona de Tomorrow's Kitchen, paquete de 12 | $14 | Amazonas | Código promocional 20OFFKINJALids son básicamente los calcetines de la cocina; siempre perdiéndose, dejando contenedores huérfanos que nunca podrán volver a cerrarse. Pero, ¿y si sus tapas pudieran estirarse y adaptarse a todos los recipientes, ollas, sartenes e incluso frutas en rodajas grandes que sobran? Nunca más tendrás que preocuparte por perder esa tapa tan específica.

Patinaje artístico de EE. UU. 'frustrado' por falta de decisión final en evento por equipos, pide una decisión justa

Patinaje artístico de EE. UU. 'frustrado' por falta de decisión final en evento por equipos, pide una decisión justa

El equipo está a la espera de las medallas que ganó en los Juegos Olímpicos de Invierno de 2022 en Beijing, ya que se está resolviendo un caso de dopaje que involucra a la patinadora artística rusa Kamila Valieva.

Los compradores de Amazon dicen que duermen 'como un bebé mimado' gracias a estas fundas de almohada de seda que cuestan tan solo $ 10

Los compradores de Amazon dicen que duermen 'como un bebé mimado' gracias a estas fundas de almohada de seda que cuestan tan solo $ 10

Miles de compradores de Amazon recomiendan la funda de almohada de seda Mulberry, y está a la venta en este momento. La funda de almohada de seda viene en varios colores y ayuda a mantener el cabello suave y la piel clara. Compre las fundas de almohada de seda mientras tienen hasta un 46 por ciento de descuento en Amazon

Se busca al corredor de los Bengals Joe Mixon por orden de arresto emitida por presuntamente apuntar con un arma de fuego a una mujer

Se busca al corredor de los Bengals Joe Mixon por orden de arresto emitida por presuntamente apuntar con un arma de fuego a una mujer

El jueves se presentó una denuncia de delito menor amenazante agravado contra Joe Mixon.

Profesor de la Universidad de Purdue arrestado por presuntamente traficar metanfetamina y proponer favores sexuales a mujeres

Profesor de la Universidad de Purdue arrestado por presuntamente traficar metanfetamina y proponer favores sexuales a mujeres

El Departamento de Policía de Lafayette comenzó a investigar a un profesor de la Universidad de Purdue en diciembre después de recibir varias denuncias de un "hombre sospechoso que se acercaba a una mujer".

Concept Drift: el mundo está cambiando demasiado rápido para la IA

Concept Drift: el mundo está cambiando demasiado rápido para la IA

Al igual que el mundo que nos rodea, el lenguaje siempre está cambiando. Mientras que en eras anteriores los cambios en el idioma ocurrían durante años o incluso décadas, ahora pueden ocurrir en cuestión de días o incluso horas.

India me está pateando el culo

India me está pateando el culo

Estoy de vuelta por primera vez en seis años. No puedo decirte cuánto tiempo he estado esperando esto.

ℝ

“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.

¿Merrick Garland le ha fallado a Estados Unidos?

Es más de la mitad de la presidencia de Biden. ¿Qué está esperando Merrick Garland?

¿Merrick Garland le ha fallado a Estados Unidos?

Creo, un poco tarde en la vida, en dar oportunidades a la gente. Generosamente.

Language