Я всегда включал пространство имен или относительный путь во включать защите, потому что только одно только название заголовка, оказалось, было опасно.
, Например, у Вас есть некоторый крупный проект с этими двумя файлами где-нибудь в Вашем коде
/myproject/module1/misc.h
/myproject/module2/misc.h
Поэтому при использовании последовательной схемы именования для Вашего включать защиту, Вы могли бы закончить с определением _MISC_HPP__
в обоих файлах (очень забавный для нахождения таких ошибок).
, Таким образом, я обосновался с
MYPROJECT_MODULE1_MISC_H_
MYPROJECT_MODULE2_MISC_H_
, Эти имена довольно длинны, но по сравнению с болью двойных определений это стоит того.
Другая опция, если Вам не нужен компилятор/независимость от платформы, Вы могли бы искать некоторый #pragma однажды материал.
Я всегда использую INCLUDED_FOO_HPP
, я не использовал бы двойное подчеркивание один, потому что резервируются стартовые вещи с двойными подчеркиваниями.
Чтобы действительно избежать коллизий имени я использую GUID:
#ifndef GUARD_8D419A5B_4AC2_4C34_B16E_2E5199F262ED
Лично, я просто использую имя файла FOO_HPP. Google использует целый путь как SRC_ENGINE_FAST_HPP.
наборы Certain имен и функциональных подписей всегда резервируются к реализации:
- Каждое имя, которое содержит двойное подчеркивание (_ _) или начинается с подчеркивания, сопровождаемого прописной буквой (2.11), резервируется к реализации для любого использования.
- Каждое имя, которое начинается с подчеркивания, резервируется к реализации для использования в качестве имени в глобальном пространстве имен.
(17.4.3.1.2/1
)
Я предпочитаю этот формат:
#ifndef FOO_HPP
#define FOO_HPP
/* ... */
#endif // FOO_HPP
MYLIB_FOO_HPP
, и оно помогает избежать конфликтов имен. Я использую
#if !defined(FOO_HPP_INCLUDED)
, я предпочитаю современное defined
синтаксис, потому что он позволяет || & & операторы, даже если они не используются здесь.
Также
#ifndef __FOO_HPP__
технически недопустимо, поскольку начальные символы подчеркивания резервируются.
Если Вы используете Visual Studio, или компилятор Microsoft используют прагму путь
#pragma once
Когда мне платят в течение моего времени, и уже нет стандарта компании, я использую:
#ifndef path_to_file_h
#define path_to_file_h
причина нижнего регистра состоит в том, что легче скопировать и вставить имена файлов и наклонные черты замены с символами нижнего подчеркивания. Причина #ifndef состоит в том, что он выстраивается в линию приятно с #define, помогая видеть, что символы являются тем же. Мне нравится идея GUID, тем не менее, таким образом, я мог бы испытать ее.
, Когда мне не платят в течение моего времени, и выпускающей мой код на волю, я просто использую #pragma once
. В отличие от большинства других проблем мобильности, столь же легко добавить, включают защиту позже как теперь, и это может быть сделано кем-то, кто ничего не знает о кодовой базе (например, меня за год или некоторого невинного программиста, в которого я отправляю свой код), таким образом, YAGNI применяется.
Я также всегда использовал что-то вроде:
#ifndef FOO_HPP
#define FOO_HPP 1
...
#endif
Так же большинство людей упомянуло, не предварительно ожидайте символы с двойными подчеркиваниями, как это резервируется стандартом C++ для внутреннего пользования реализацией.
Вы хотели бы смотреть на превосходную книгу John Lakos "Крупный масштаб Разработка программного обеспечения C++" (, ссылка Amazon - санированный для деточки сценария связывается, нацисты) для некоторых соображений относительно заголовка включает.
аплодисменты HTH
,
Rob
Я склонен использовать:
#ifndef FILE_DATE_H_
(заменяют _H_ соответствующим расширением как _HPP _, и т.д.). Отметка даты должна избежать коллизий с другими теми же именованными заголовками в других направлениях/библиотеках.
так в конце это похоже на это:
#ifndef SOMEFILE_20082411_H_