2008-10-22 27 views
78

Estaba buscando un código C++ de código abierto y noté una gran cantidad de puntajes dobles en el código, principalmente al comienzo de los nombres de las variables.¿Por qué las personas usan __ (doble guión bajo) tanto en C++

return __CYGWIN__; 

Sólo me preguntaba ¿hay una razón para esto, o es sólo algunos estilos de código de la gente? Pensaría que lo hago difícil de leer.

+1

¿Por qué es difícil de leer? Está diseñado principalmente como un delímetro, al igual que las comillas.Según recuerdo, se usa principalmente para constantes integradas. –

Respuesta

107

De Programming in C++, Rules and Recommendations:

El uso de dos guiones (`__ ') en los identificadores está reservado para uso interno del compilador de acuerdo con la norma ANSI-C.

Las marcas de subrayado ('_') se utilizan a menudo en los nombres de las funciones de la biblioteca (como "_main" y "_exit"). Para evitar colisiones, no comience un identificador con un guión bajo.

+0

Esa guía parece que fue escrita antes de que se introdujera 'namespace'. –

8

Es algo que no debe hacer en un código "normal". Esto garantiza que los compiladores y las bibliotecas del sistema puedan definir símbolos que no colisionen con los suyos.

32

De acuerdo con el Estándar C++, los identificadores que comienzan con un guión bajo están reservados para las bibliotecas. Los identificadores que comienzan con dos guiones bajos están reservados para los vendedores del compilador.

+14

Más que eso: los identificadores * que contienen un doble guión bajo en alguna parte de ellos * están reservados. 17.4.3.1.2 –

+0

En C++ solo veo [lex.name] y para los nombres globales [global.names]. ¿Puedes dar referencias? gracias –

9

Los comentarios anteriores son los correctos. __Symbol__ es generalmente un token mágico proporcionado por su proveedor de compilador (o preprocesador) útil. Quizás los más utilizados son __FILE__ y __LINE__, que el preprocesador C amplía para indicar el nombre de archivo y el número de línea actuales. Esto es útil cuando desea registrar algún tipo de error de aserción del programa, incluida la ubicación textual del error.

1

Además de las bibliotecas que muchas otras personas respondieron, algunas personas también nombran macros o valores #define para usar con el preprocesador. Esto facilitaría el trabajo y podría haber permitido que se solucionaran los errores en los compiladores más antiguos.

Como otros mencionados, ayuda a evitar la colisión de nombres y ayuda a delinear entre las variables de la biblioteca y las suyas.

46

A menos que sientan que son "parte de la implementación", es decir, las bibliotecas estándar, entonces no deberían.

Las reglas son bastante específicas, y son un poco más detalladas que otras sugeridas.

Todos los identificadores que contienen un doble guión bajo o comienzan con un guión bajo seguido de una letra mayúscula están reservados para el uso de la implementación en todos los ámbitos, es decir, pueden usarse para macros.

Además, todos los demás identificadores que comiencen con un guión bajo (es decir, no seguido de otro guión bajo o una letra mayúscula) se reservan para la implementación en el ámbito global. Esto significa que puede usar estos identificadores en sus propios espacios de nombres o en las definiciones de clase.

Esta es la razón por la cual Microsoft usa nombres de funciones con un guion bajo y todos en minúscula para muchas de sus funciones de biblioteca de tiempo de ejecución central que no son parte del estándar C++. Se garantiza que estos nombres de función no entren en conflicto con las funciones estándar de C++ o las funciones de código de usuario.

+1

En C++ solo veo [lex.name] y para los nombres globales [global.names]. ¿Puedes dar referencias? Gracias –

Cuestiones relacionadas