Вопрос

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

#ifndef FOO_H
#define FOO_H

// ...

#endif

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

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

Это было полезно?

Решение

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

Так test.h становится TEST_H.

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

Другие советы

Я лично следую рекомендации Буста. Возможно, это одна из крупнейших коллекций библиотек C ++ хорошего качества, и у них нет проблем.

Это так:

<project>_<path_part1>_..._<path_partN>_<file>_<extension>_INCLUDED

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

который:

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

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

И, очевидно, я бы, а не все компиляторы, внедряют #pragma once (или лучше, #pragma multiple и "Однажды" - поведение по умолчанию ...)

Взят прямо из Руководство по стилю Google:

Все файлы заголовков должны иметь #Define Guards, чтобы предотвратить многочисленное включение. Формат имени символа должно бытьu003CPROJECT> _u003CPATH> _u003CFILE> _ЧАС_. Чтобы гарантировать уникальность, они должны основываться на полном пути в исходном дереве проекта. Например, файл foo/src/bar/baz.h в Project Foo должен иметь следующий охранник:

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

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

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

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

#include "mylib/myheader.h"

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

#define MYLIB_MYHEADER_H

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

Заменять FOO_H с FOO_H_INCLUDED И это яснее.

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

Тем не менее, это может привести к имени столкновения с простыми и/или общими именами. По этой причине заголовок с автогенерируемой, такой как STDAFX.H в непустых визуальных проектах C 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, Это дополнительная мера предосторожности, и вам в любом случае вам никогда не придется вспоминать это, поэтому вам не нужно беспокоиться о том, что это загадочно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top