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との間のすべてのコード#endifはコンパイラによって単純に無視され (_MOVE_H他の場所で定義していないことを誓います)、定義の欠落に関するあらゆる種類のエラーが発生します。私は何か間違ったことをしたと思っていましたが、別のキーを使用しようとすると ( のよう_MOVE_Haに、すべてが正常に戻りまし_MOVE_Hた。C++ で何か特別なことを意味しますか?

問題があれば、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

経験則として、またはで始まるもの (実際には何でも) を使用しないください。内部使用のために予約されています。用途(通常は会社名など)。___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 に答える