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 lo usarás 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á permitido por el estándar C ++?
c++
naming-conventions
standards
c++-faq
Roger Lipscombe
fuente
fuente
Respuestas:
Las reglas (que no cambiaron en C ++ 11):
std
espacio de nombres está reservado. (Sin embargo, puede agregar especializaciones de plantilla).Del 2003 C ++ Standard:
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:
Se pueden aplicar otras restricciones. Por ejemplo, el estándar POSIX reserva muchos identificadores que pueden aparecer en el código normal:
E
siguen un dígito o una letra mayúscula:is
oto
seguidos de una letra minúsculaLC_
seguidos de una letra mayúsculaf
ol
están reservadosSIG
seguidos de una letra mayúscula están reservados.SIG_
seguidos de una letra mayúscula están reservados.str
,mem
owcs
seguidos de una letra minúscula están reservadosPRI
oSCN
seguidos de cualquier letra minúscula oX
están reservados_t
están reservadosSi 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.
fuente
_Bool
y_Imaginary
no existe en C ++? El lenguaje C ++ se define explícitamente, no en términos de "ediciones" a C, de lo contrario, el estándar podría ser mucho más corto.Las reglas para evitar la colisión de nombres están en el estándar C ++ (ver el libro de Stroustrup) y mencionadas por los gurús de C ++ (Sutter, etc.).
Regla personal
Debido a que no quería tratar casos, y quería una regla simple, he diseñado una regla personal que es simple y correcta:
Al nombrar un símbolo, evitará la colisión con el compilador / OS / bibliotecas estándar si:
Por supuesto, poner su código en un espacio de nombre único también ayuda a evitar colisiones (pero no protegerá contra las macros malvadas)
Algunos ejemplos
(Uso macros porque son más contaminantes de código de símbolos C / C ++, pero podría ser cualquier cosa, desde el nombre de la variable hasta el nombre de la clase)
Extractos del borrador de C ++ 0x
Del archivo n3242.pdf (espero que el texto estándar final sea similar):
Pero tambié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 ...
fuente
__WRONG_AGAIN__
contiene dos guiones bajos consecutivos (dos al principio y dos al final), por lo que esto está mal de acuerdo con el estándar.WRONG__WRONG
contiene dos guiones bajos consecutivos (dos en el medio), por lo que esto está mal de acuerdo con el estándar__attribute__
para GCC).1234567L
o4.0f
; IIRC se refiere a ohttp: //en.cppreference.com/w/cpp/language/user_literalWhy is there any problem of having two consecutive underscores in the middle according to the standard?
Porque la norma dice que están reservados. Este no es un consejo sobre el estilo bueno o malo. Es una decisión del estándar. ¿Por qué decidieron esto? Supongo que los primeros compiladores ya usaban tales convenciones de manera informal antes de la estandarización.De MSDN :
Esto significa que puede usar un solo guión bajo como prefijo de variable miembro, siempre que vaya seguido de una letra minúscula.
Aparentemente, esto se toma 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.
Ver también esta pregunta .
fuente
En cuanto a la otra parte de la pregunta, es común poner el guión bajo al final del nombre de la variable para no chocar con nada interno.
Hago esto incluso dentro de las clases y espacios de nombres porque solo tengo que recordar una regla (en comparación con "al final del nombre en el ámbito global y el comienzo del nombre en cualquier otro lugar").
fuente
Sí, los guiones bajos se pueden usar en cualquier parte de un identificador. Creo que las reglas son: cualquiera de az, AZ, _ en el primer carácter y aquellos + 0-9 para los siguientes caracteres.
Los prefijos de subrayado son comunes en el código C: un solo guión bajo significa "privado", y los subrayados dobles generalmente están reservados para el compilador.
fuente