в C ++, что особенного в "_MOVE_H"? - PullRequest
7 голосов
/ 27 июля 2010

У меня есть файл 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 ++?

Я использую Ubuntu10.04, GCC 4.4.3, если это имеет значение.

Спасибо,

Ответы [ 4 ]

16 голосов
/ 27 июля 2010

просто запустите grep _MOVE_H в / usr / include / c ++ на вашем компьютере

для меня:

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

Как правило, не используйте вещи (на самом деле что-нибудь) с префиксом _ или __. Это зарезервировано для внутреннего использования. Используйте SOMETHING_MOVE_H (обычно название компании, ...).

Полагаю, это новый заголовок, используемый для добавления семантики перемещения в c ++ 0x.

6 голосов
/ 27 июля 2010

Все, что начинается с подчеркивания, затем заглавной буквы, зарезервировано для реализации.(т.е. _M).Я думаю, что в целом вы хотите держаться подальше от ведущих подчеркиваний.

4 голосов
/ 27 июля 2010

Я считаю, что у gcc есть включаемый файл с именем move.h, который включает в себя страж _MOVE_H Предположительно, вы столкнулись с этим. Используйте другой идентификатор, предпочтительно тот, который не начинается с подчеркивания. Я положил GUID в мой, но тогда я действительно навязчивый: -)

0 голосов
/ 27 июля 2010

Это хитрость, которая предотвращает включение одного и того же заголовочного файла более одного раза. Фактическое значение, которое вы #define, не имеет значения - поскольку оно определено только в этом заголовочном файле, соглашение называется NAME_HEADER_FILE_H прописными буквами

См. Также это обсуждение на # pragma Once

...