2010-07-27 8 views
6

tengo un Archivo C++ como estoen C++, ¿qué tiene de especial "_MOVE_H"?

#ifndef _MOVE_H 
#define _MOVE_H 

class Move { 
    int x, y; 
public: 
    Move(int initX = 0, int initY = 0) : x(initX), y(initY) {} 
    int getX() { return x; } 
    void setX(int newX) { x = newX; } 
    int getY() { return y; } 
    void setY(int newY) { y = newY; } 
}; 

#endif 

Y para mi sorpresa, todo el código entre #ifndef y #endif es simplemente ignorado por el compilador (Juro que no estoy definiendo _MOVE_H cualquier otro lugar), y tengo todo tipo de errores sobre las definiciones faltantes. Estaba pensando que hice algo mal, pero cuando trato de usar otra clave (como _MOVE_Ha, todo vuelve a la normalidad. ¿Tiene _MOVE_H algo especial en C++?

Estoy ejecutando Ubuntu 10.04, GCC 4.4.3 , si lo que importa

Gracias,

+1

puede ser uno de los archivos de la biblioteca que está usando para su inclusión Guardia? lo revisaste? Por cierto, normalmente prefijo con el nombre del proyecto para evitar exactamente este tipo de problema. – Naveen

+0

Otra razón para usar '#pragma una vez' en lugar de' # define' incluye guardias ... – Inverse

+4

@Inverse, '#pragma once' es una extensión del compilador y no es compatible con todos los compiladores. Los guardias de inclusión son los únicos medios independientes seguros del compilador para evitar la inclusión múltiple. –

Respuesta

15

simplemente correr _MOVE_H grep en/usr/include/C++ en su máquina

para mí:

c++/4.5.0/bits/move.h:#ifndef _MOVE_H 

Como regla general, no utilice cosas (realmente nada) prefijo por _ o __. Está reservado para uso interno. Use SOMETHING_MOVE_H (generalmente nombre de la empresa, ...).

Supongo que es un nuevo encabezado utilizado para agregar el movimiento semántico a C++ 0x.

+12

Para aclarar la regla de guión bajo, las siguientes cosas están reservadas: cualquier nombre * global * prefijado por '_', cualquier nombre de cualquier tipo prefijado por' __', y cualquier nombre de cualquier tipo prefijado por '_' y comenzando con una letra mayúscula. El OP entra en conflicto con las reglas primera y tercera. –

+6

Cualquier nombre que contenga un '__' es reservado. No necesita ser prefijado. –

0

es un truco para evitar que el mismo fichero de cabecera se incluye más de una vez el valor real que #define no importa -.. siempre que se define sólo en esa cabecera archivo, la convención es NAME_HEADER_FILE_H en mayúsculas

Ver también este artículo en #pragma once

+2

lo siento, ese no es realmente el problema. el problema es que mi archivo no se incluye en absoluto. – phunehehe

+0

Lo sentimos, no leí la Q con suficiente detalle –

5

Cualquier cosa que comience con un guión bajo y mayúscula se reserva para la implementación. (es decir, _M). Creo que, en general, quiere mantenerse alejado de los guiones bajos principales.

4

Creo que gcc tiene un archivo de inclusión llamado move.h que incluye el centinela _MOVE_H. Presumiblemente ha chocado con esto. Use un identificador diferente, preferiblemente uno que no comience con un guión bajo. Puse un GUID en el mío, pero luego estoy realmente obsesivo :-)

+0

upvote para el guid! Jaja! –

Cuestiones relacionadas