【发布时间】:2011-03-21 16:25:19
【问题描述】:
我有一个这样的 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,如果这很重要的话。
谢谢,
【问题讨论】:
-
可能是您包含的库文件之一,使用它作为包含保护?你检查了吗?顺便说一句,我通常会在它前面加上项目名称,以避免出现此类问题。
-
另一个使用
#pragma once而不是#define的理由包括警卫... -
@Inverse,
#pragma once是编译器扩展,并非所有编译器都支持。包含保护是唯一安全的独立于编译器的防止多重包含的方法。 -
@Nathan Ernst:我知道,但是如果您使用 3 个主要编译器中的任何一个,
#pragma once使编译器不必在每次编译时都打开和处理相同的受保护标头。 -
编译器也不需要打开和处理普通的头文件。识别包含守卫的想法是十多年前发明并实施的,IIRC。
标签: c++ include-guards