в C++, что является настолько особенным о “_MOVE_H”?

У меня есть файл 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, если это имеет значение.

Спасибо,

7
задан phunehehe 27 July 2010 в 15:22
поделиться

4 ответа

просто выполните grep _MOVE_H в /usr/include/c++ на вашей машине

для меня:

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

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

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

16
ответ дан 6 December 2019 в 06:48
поделиться

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

6
ответ дан 6 December 2019 в 06:48
поделиться

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

4
ответ дан 6 December 2019 в 06:48
поделиться

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

Смотрите также обсуждение #pragma once

0
ответ дан 6 December 2019 в 06:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: