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

Как обычно 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 , это дополнительная предосторожность, и вам никогда не придется ничего запомнить, так что вам не нужно беспокоиться о том, что это загадочная ,

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