Готовый перевод Google C++ Style Guide / Google C++ Style Guide: Header File Dependencies

Внимание! Этот перевод, возможно, ещё не готов, так как модераторы установили для него статус «идёт перевод»

Зависимости заголовочных файлов

Не используйте #include, если возможно использовать предварительное объявление.

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

Вы можете значительно уменьшить количество заголовочных файлов, которые вам нужно включить в свои заголовочные файлы, используя предварительные объявления. Например, если ваш заголовочный файл использует класс File так, что ему не требуется доступ к объявлению класса File, ваш заголовочный файл может просто предварительно объявить class File; вместо использования #include "file/base/file.h".

Когда мы можем использовать класс Foo в заголовочном файле без доступа к его объявлению?

Мы можем объявлять поля типа Foo* или Foo&

Мы можем объявлять (но не определять) функции с аргументами и/или возвращаемыми значениями типа Foo (Единственное исключение — когда аргумент Foo или const Foo& имеет неявный конструктор с одним аргументом, в таком случае необходимо предоставить полное определение для поддержки автоматического преобразования типа).

Мы можем объявлять статические поля типа Foo, так как статические поля определяются вне определения класса.

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

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

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

Заметка: если вы используете символ Foo в вашем коде, вам следует добавить определение для Foo самим, либо с помощью #include, либо с помощью предварительного объявления. Не полагайтесь на введение символа с помощью заголовочного файла, не включенного напрямую. Единственное исключение — когда Foo использован в myfile.cc, можно включать (или предварительно объявлять) Foo в myfile.h вместо myfile.cc.

Внимание! Этот перевод, возможно, ещё не готов.
Его статус: идёт перевод

Переведено на Нотабеноиде
http://notabenoid.org/book/32830/114582

Переводчики: Dynorth, mayorovp, flyngate

Настройки

Готово:

100.00% КП = 1.4