Именование включает охранников

Как обычно C ++ содержат защитников? Я склонен видеть это много:

#ifndef FOO_H #define FOO_H // ... #endif 

Однако я не думаю, что это очень интуитивно. Не видя имени файла, сложно сказать, что такое FOO_H и к чему относится его имя.

Что считается лучшей практикой?

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

    Таким образом test.h становится TEST_H .

    Реальные примеры жизни include Qt Creator, который следует за этим соглашением при автогенерации заголовочных файлов classа.

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

    Это выглядит так:

     __...____INCLUDED // include/pet/project/file.hpp #ifndef PET_PROJECT_FILE_HPP_INCLUDED 

    который:

    • (обратите внимание, что начиная с _[AZ] или содержащего __ нет)
    • легко генерировать
    • гарантированно быть уникальным (в качестве защитника) в рамках проекта (иначе у вас есть два файла в одном месте)
    • гарантированно не использоваться ни для чего другого (если вы закончите другой макрос с INCLUDED вы портите для боя)

    Я читал о GUID, но они выглядят странно.

    И, очевидно, я предпочел бы, чтобы все компиляторы #pragma once реализовали #pragma once (или лучше, #pragma multiple и «once» – поведение по умолчанию …)

    Взято непосредственно из руководства по стилю google :

    Все файлы заголовков должны содержать #define guard для предотвращения множественного включения. Формат имени символа должен быть _ _ _H_. Чтобы гарантировать уникальность, они должны основываться на полном пути в исходном дереве проекта. Например, файл foo / src / bar / baz.h в проекте foo должен иметь следующую защиту:

      #ifndef FOO_BAR_BAZ_H_ #define FOO_BAR_BAZ_H_ ... #endif // FOO_BAR_BAZ_H_ 

    Я использую этот стиль в своих проектах.

    Посмотрите на код, который # include – ваш заголовок.

    Если это что-то вроде:

     #include "mylib/myheader.h" 

    mylib/myheader.h уже является уникальным именем. Просто капитализируйте и замените / и. с _

     #define MYLIB_MYHEADER_H 

    Если у вас есть два заголовка на вашем пути включения с тем же именем относительно пути включения, у вас уже есть столкновение на этом уровне.

    Замените FOO_H на FOO_H_INCLUDED и это более FOO_H_INCLUDED .

    Как упоминалось ранее, очень распространенное соглашение заключается в использовании прописной версии имени, а точка заменена символом подчеркивания: foo.h -> FOO_H

    Однако это может привести к конфликтам имен с простыми и / или общими именами. По этой причине автогенерированный заголовок, подобный stdafx.h в непустых проектах Visual C C ++, добавляет некоторую случайную строку, например:

     #ifndef FOO_H__NsknZfLkajnTFBpHIhKS #define FOO_H__NsknZfLkajnTFBpHIhKS #endif 

    http://www.random.org/strings/ – полезный случайный генератор для этого.

    Кроме того, если файл является частью какого-либо подмодуля или его содержимое находится в одном конкретном пространстве имен, я, как правило, добавляю это к стражу тоже:

     #ifndef SOMECOMPONENT_FOO_H__NsknZfLkajnTFBpHIhKS #define SOMECOMPONENT_FOO_H__NsknZfLkajnTFBpHIhKS namespace somecomponent { ... } #endif 

    Обычно я использую что-то вроде FOO_H_INCLUDED_ . Несколько заголовков (Microsoft) имеют то, что очень похоже на строковое представление GUID, но мне никогда не нужно было ничего такого сложного.

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

    Я обычно смотрю, какое время это и просто добавляет, что до конца, то есть FOO_H_248 , это дополнительная предосторожность, и вам никогда не придется ничего запомнить, так что вам не нужно беспокоиться о том, что это загадочная ,

    Interesting Posts

    Форматирование Word – необходимо выравнивать слева направо, справа налево в одной строке

    WPF MVVM просматривает просмотры

    Обработка проверки ModelState в веб-интерфейсе ASP.NET

    Жесткий диск 750Gig показывает полнофункциональный только 315Gigs

    Как сделать снимок экрана в Java?

    Python-OpenCV cv2 Ошибка OpenCV: утверждение не выполнено (scn == 3 || scn == 4) в неизвестной функции, файл .. \ .. \ .. \ modules \ imgproc \ src \ color.cpp

    Кнопка пользовательской формы Android

    Цвет заливки и границы в geom_point (scale_colour_manual) в ggplot

    Android-шлюз, подписанный якорем HTTPS, для пути сертификации не найден

    рисовать эллипс и эллипсоид в MATLAB

    Удалить class = атрибут

    Activity.finish (), но активность остается загруженной в память

    OpenWRT / DD-WRT / совместимый с томатом Wi-Fi ретранслятор?

    Почему я должен применять методы по признаку, а не как часть этого признака?

    Вложенная вкладка в Google Chrome имеет эффект рябины или выделения

    Давайте будем гением компьютера.