Лучшие практики для использования [закрытых] заголовочных файлов C++

20
задан Peter Mortensen 20 August 2010 в 18:55
поделиться

5 ответов

  1. я услышал, что наличие комментирует, прежде чем включать защита сможет заставить некоторые компиляторы пропускать оптимизацию. Если защита является самой первой вещью, компилятор может распознать идиому и даже не потрудиться открываться, заголовок для последующего включает. В моем собственном коде комментарии обычно предшествуют включать защите. Я никогда не потрудился тестировать, чтобы видеть, оказывает ли это какое-либо влияние или нет. И я, вероятно, никогда не буду (но если бы кто-то еще делает, я интересовался бы результатами).

  2. , Конечно, заголовки должны включить пространства имен - иначе, ничто полезное никогда не могло быть в пространстве имен. Однако как Вы упомянули, заголовки не должны 'импортировать' (из-за отсутствия лучшего слова) пространства имен в единицу компиляции с' using' директива.

7
ответ дан 30 November 2019 в 00:27
поделиться
  1. порядок включать защиты и комментариев является просто вопросом стиля - он не будет иметь никакого измеримого эффекта на скорость компиляции.

  2. Пространства имен абсолютно должны использоваться в заголовочных файлах для объявления функций, классов, globals, и т.д. Что Вы должны не , делают использовать using операторы в заголовочных файлах - невозможно не использовать что-то в исходном файле, который включает его, и Вы не должны вынуждать includers добавить дополнительный материал к глобальной области видимости. Если необходимо использовать вещи от других пространств имен в заголовках, полностью определите каждое имя. Это может иногда быть боль, но это - действительно правильный поступок.

Примеры:

// WRONG!
using namespace std;
class MyClass
{
    string stringVar;
};

// RIGHT
class MyClass
{
    std::string stringVar;
};

Что касается предописаний классов в других пространствах имен, у Вас есть он точно правильный. Просто не забудьте всегда квалифицировать AnotherFoo как AnotherNameSpace::AnotherFoo при ссылке на него в заголовке. Действительно, предописания являются единственным способом повредить циклические зависимости.

18
ответ дан 30 November 2019 в 00:27
поделиться

Относительно № 1 я не знаю ни о каком конкретном аргументе за или против. Многие компании имеют политику, где уведомление об авторском праве должно быть первым объектом в файле ПЕРЕД чем-либо еще или любым значимым кодом (возможно, предположение - то, что Вы считаете авторское право перед поглощением любого кода). С этой целью #IFNDEF уже является кодом. С точки зрения удобства использования имеет смысл помещать авторские права сначала, потому что глаз игнорирует их. Однако что-либо описывающее модуль должно прибыть после #ifndef, по-моему.

3
ответ дан 30 November 2019 в 00:27
поделиться

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

2) Это корректно. Если Вы хотите поместить класс в пространстве имен, и тот класс собирается быть объявленным в заголовочном файле, хорошо затем это должно быть объявлено в пространстве имен, которое таким образом должно быть в заголовочном файле. И да, это - то, как Вы вперед объявляете точно. И да, это - основной инструмент для, избегают циклической зависимости (Вы могли также изменить свой дизайн, но нет ничего неправильно с циклическим, в принципе обеспечил, эти два рассматриваемых класса только относятся друг к другу ссылкой или указателем и не называют любые методы).

2
ответ дан 30 November 2019 в 00:27
поделиться
  1. я не думаю, добавляя, что комментарии оказывают любое влияние производительности, как указано ответом Adam на это сообщение.

  2. я использовал меня пространства имен в заголовочных файлах, что, если бы Вы определяете Вас собственный строковый класс, таким образом, он столкнулся бы со строковым классом пространства имен станд.

Используя ключевое слово "использования" точно не является неправильным (так как оно дает Вам большое удобство и партию меньше для ввода перед всеми переменными)

2
ответ дан 30 November 2019 в 00:27
поделиться
Другие вопросы по тегам:

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