Заголовок #include охраняет формат?

20
задан Brian Tompsett - 汤莱恩 27 November 2015 в 11:18
поделиться

11 ответов

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

, Например, у Вас есть некоторый крупный проект с этими двумя файлами где-нибудь в Вашем коде

/myproject/module1/misc.h
/myproject/module2/misc.h

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

, Таким образом, я обосновался с

MYPROJECT_MODULE1_MISC_H_
MYPROJECT_MODULE2_MISC_H_

, Эти имена довольно длинны, но по сравнению с болью двойных определений это стоит того.

Другая опция, если Вам не нужен компилятор/независимость от платформы, Вы могли бы искать некоторый #pragma однажды материал.

20
ответ дан 29 November 2019 в 22:42
поделиться

Я всегда использую INCLUDED_FOO_HPP

, я не использовал бы двойное подчеркивание один, потому что резервируются стартовые вещи с двойными подчеркиваниями.

14
ответ дан 29 November 2019 в 22:42
поделиться

Чтобы действительно избежать коллизий имени я использую GUID:

#ifndef GUARD_8D419A5B_4AC2_4C34_B16E_2E5199F262ED
13
ответ дан 29 November 2019 в 22:42
поделиться

Лично, я просто использую имя файла FOO_HPP. Google использует целый путь как SRC_ENGINE_FAST_HPP.

наборы Certain имен и функциональных подписей всегда резервируются к реализации:

  • Каждое имя, которое содержит двойное подчеркивание (_ _) или начинается с подчеркивания, сопровождаемого прописной буквой (2.11), резервируется к реализации для любого использования.
  • Каждое имя, которое начинается с подчеркивания, резервируется к реализации для использования в качестве имени в глобальном пространстве имен.

(17.4.3.1.2/1)

10
ответ дан 29 November 2019 в 22:42
поделиться

Я предпочитаю этот формат:

#ifndef FOO_HPP
#define FOO_HPP

/* ... */

#endif // FOO_HPP
  • А, простой #ifndef вместо #if! определенный (...) , потому что редко имеет смысл использовать сложное условие для защиты заголовка.
  • часть _HPP для маркировки идентификатора как защиту заголовка.
  • Никакие начальные символы подчеркивания, потому что такие идентификаторы (запускающийся с 2 символов нижнего подчеркивания или с 1 подчеркивания и прописной буквы) резервируются для реализации.
  • основная часть является просто именем файла, НЕЧТО . Однако для кода библиотеки, который будет снова использованным, желательно добавить другую часть вначале. Это обычно - содержание пространства имен или имени "модуля", например, MYLIB_FOO_HPP , и оно помогает избежать конфликтов имен.
4
ответ дан 29 November 2019 в 22:42
поделиться

Я использую

 #if !defined(FOO_HPP_INCLUDED)

, я предпочитаю современное defined синтаксис, потому что он позволяет || & & операторы, даже если они не используются здесь.

Также

 #ifndef __FOO_HPP__

технически недопустимо, поскольку начальные символы подчеркивания резервируются.

2
ответ дан 29 November 2019 в 22:42
поделиться

Если Вы используете Visual Studio, или компилятор Microsoft используют прагму путь

#pragma once
3
ответ дан 29 November 2019 в 22:42
поделиться

Когда мне платят в течение моего времени, и уже нет стандарта компании, я использую:

#ifndef path_to_file_h
#define path_to_file_h

причина нижнего регистра состоит в том, что легче скопировать и вставить имена файлов и наклонные черты замены с символами нижнего подчеркивания. Причина #ifndef состоит в том, что он выстраивается в линию приятно с #define, помогая видеть, что символы являются тем же. Мне нравится идея GUID, тем не менее, таким образом, я мог бы испытать ее.

, Когда мне не платят в течение моего времени, и выпускающей мой код на волю, я просто использую #pragma once. В отличие от большинства других проблем мобильности, столь же легко добавить, включают защиту позже как теперь, и это может быть сделано кем-то, кто ничего не знает о кодовой базе (например, меня за год или некоторого невинного программиста, в которого я отправляю свой код), таким образом, YAGNI применяется.

1
ответ дан 29 November 2019 в 22:42
поделиться

Я всегда использую использование

#ifndef FOOBAR_CPP
1
ответ дан 29 November 2019 в 22:42
поделиться

Я также всегда использовал что-то вроде:

#ifndef FOO_HPP
#define FOO_HPP 1

...

#endif

Так же большинство людей упомянуло, не предварительно ожидайте символы с двойными подчеркиваниями, как это резервируется стандартом C++ для внутреннего пользования реализацией.

Вы хотели бы смотреть на превосходную книгу John Lakos "Крупный масштаб Разработка программного обеспечения C++" (, ссылка Amazon - санированный для деточки сценария связывается, нацисты) для некоторых соображений относительно заголовка включает.

аплодисменты HTH

,

Rob

1
ответ дан 29 November 2019 в 22:42
поделиться

Я склонен использовать:

#ifndef FILE_DATE_H_

(заменяют _H_ соответствующим расширением как _HPP _, и т.д.). Отметка даты должна избежать коллизий с другими теми же именованными заголовками в других направлениях/библиотеках.

так в конце это похоже на это:

#ifndef SOMEFILE_20082411_H_
0
ответ дан 29 November 2019 в 22:42
поделиться
Другие вопросы по тегам:

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