我有一个像这样的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
),而且我拥有所有代码关于缺失定义的各种错误。我在想我做错了什么,但是当我尝试使用另一个键(比如_MOVE_Ha
时,一切都恢复正常。_MOVE_H
是否意味着C ++中的一些特殊内容?
如果重要的话,我正在运行Ubuntu 10.04,GCC 4.4.3。
谢谢,
答案 0 :(得分:16)
在你的机器上运行/ usr / include / c ++中的grep _MOVE_H
对我来说:
c++/4.5.0/bits/move.h:#ifndef _MOVE_H
根据经验,不要使用前缀为_
或__
的内容(实际上是任何内容)。它保留供内部使用。
使用SOMETHING_MOVE_H
(通常是公司名称,......)。
我猜这是一个新的标题,用于将移动语义添加到c ++ 0x。
答案 1 :(得分:6)
任何以下划线开头的大写字母都保留给实现。 (即_M
)。我想一般来说你想远离领先的下划线。
答案 2 :(得分:4)
我相信gcc有一个名为move.h的包含文件,其中包含sentinel _MOVE_H。据推测,你已经与此相撞了。使用不同的标识符,最好是不以下划线开头的标识符。我把一个GUID放在我的手里,但后来我非常痴迷: - )
答案 3 :(得分:0)
防止同一个头文件被多次包含是一种技巧。你#define的实际值无关紧要 - 只要它只在那个头文件中定义,约定是大写的NAME_HEADER_FILE_H
上的讨论