2010-07-27 2 views
6

У меня есть C++ файл как этотв C++, что особенного в «_MOVE_H»?

#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 , если это имеет значение

Спасибо,

+1

Возможно, это один из файлов библиотеки, в который вы включаете, используя его для своего охранника включения? ты это проверил? Кстати, я обычно префикс его с именем проекта, чтобы избежать такого типа проблемы. – Naveen

+0

Другая причина использования '#pragma once' вместо' # define' включает в себя защиту ... – Inverse

+4

@Inverse, '#pragma once' является расширением компилятора и не поддерживается всеми компиляторами. Включить охранники - единственный безопасный независимый от компилятора способ предотвращения множественного включения. –

ответ

15

просто запустить Grep _MOVE_H в/USR/включать/C++ на вашей машине

для меня:

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

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

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

+12

Чтобы прояснить правило подчеркивания, зарезервированы следующие вещи: любое * глобальное * имя, префиксное '_', любое имя любого типа с префиксом' __' и любое имя любой тип, начинающийся с '_' и начинающийся с прописной буквы. OP работает против первого и третьего правил. –

+6

Сохранено любое имя, содержащее '__'. Его не нужно префикс. –

0

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

См. также эту дискуссию on on #pragma once

+2

извините, это не проблема. проблема в том, что мой файл вообще не включен. – phunehehe

+0

Извините, не читал Q достаточно подробно –

5

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

4

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

+0

upvote для направляющих! ЛОЛ! –

Смежные вопросы