7

我有一个像这样的 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和之间的所有代码(我发誓我没有在其他任何地方定义),并且我有各种关于缺少定义的错误。我在想我做错了什么,但是当我尝试使用另一个键时(比如,一切都恢复正常了。在 C++ 中是否意味着一些特殊的东西?#endif_MOVE_H_MOVE_Ha_MOVE_H

如果这很重要,我正在运行 Ubuntu 10.04、GCC 4.4.3。

谢谢,

4

4 回答 4

16

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

为了我 :

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

根据经验,不要使用以or为前缀的东西(实际上是任何东西) 。它保留供内部使用。使用(通常是公司名称,...)。___SOMETHING_MOVE_H

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

于 2010-07-27T15:26:19.443 回答
6

任何以下划线开头的大写字母都保留给实现。(即_M)。我认为总的来说,您希望远离前导下划线。

于 2010-07-27T15:25:34.220 回答
4

我相信 gcc 有一个名为 move.h 的包含文件,其中包含标记 _MOVE_H。想必你已经和这个发生了冲突。使用不同的标识符,最好是不以下划线开头的标识符。我在我的里面放了一个 GUID,但是我真的很着迷:-)

于 2010-07-27T15:29:25.623 回答
0

这是防止同一个头文件被多次包含的技巧。您 #define 的实际值无关紧要 - 只要它仅在该头文件中定义,约定是大写的 NAME_HEADER_FILE_H

另请参阅#pragma once上的讨论

于 2010-07-27T15:24:00.090 回答