在C ++中,“_MOVE_H”有什么特别之处?

我有这样的C ++文件

#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 

令我惊奇的是,编译器忽略了#ifndef#endif之间的所有代码(我发誓我没有在其他地方定义_MOVE_H ),而且我对于缺less的定义有各种各样的错误。 我在想,我做错了什么,但是当我尝试使用另一个键(比如_MOVE_Ha ,一切都恢复正常了, _MOVE_H是否意味着C ++中特别的东西?

如果有问题,我正在运行Ubuntu 10.04,GCC 4.4.3。

谢谢,

只需在机器上的/ usr / include / c ++中运行grep _MOVE_H即可

为了我 :

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

作为一个经验法则,不要使用以___为前缀的东西 (真的是任何东西)。 它被保留用于内部使用。 使用SOMETHING_MOVE_H (通常是公司的名字,…)。

我想这是一个新的标题,用于将移动语义添加到c ++ 0x。

任何以下划线开始,然后大写字母保留给实施。 (即_M )。 总的来说,我认为你想避开领先的下划线。

我相信gcc有一个名为move.h的include文件,其中包含了标记_MOVE_H。 大概你已经与此相撞。 使用不同的标识符,最好是不以下划线开头的标识符。 我把我的GUID,但后来我真的迷恋:-)

这是一个避免同一头文件被多次包含的技巧。 #define的实际值并不重要,只要它只在该头文件中定义,约定就是NAME_HEADER_FILE_H(大写)

另请参阅关于#pragma的讨论