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

时间:2010-07-27 15:22:13

标签: c++ include-guards

我有一个像这样的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。

谢谢,

4 个答案:

答案 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

另见#pragma once

上的讨论