Google C++ Style Guide / Google C++ Style Guide: Header File Dependencies
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Зависимости заголовочных файлов flyngate 30.10.12 в 15:05 |
|
|
Не используйте #include, если возможно использовать предварительное объявление. Dynorth 19.11.12 в 19:30 |
||
|
Когда вы включаете заголовочный файл, вы создаёте зависимость, которая заставит ваш код перекомпилироваться, когда заголовочный файл изменится. Если ваш заголовочный файл включает другие заголовочные файлы, любые изменения в этих файлах заставят любой код, включающий ваш файл, перекомпилироваться. Поэтому мы преподчитаем минимизировать включения, в частности, включения заголовочных файлов в другие заголовочные файлы. Dynorth 19.11.12 в 19:32 Если вы включаете заголовочный файл, вы создаете зависимость, которая заставит ваш код перекомпилироваться каждый раз при изменении заголовочного файла. Если при этом ваш заголовочный файл включает другие заголовочные файлы, любые изменения в этих файлах также заставят ваш код перекомпилироваться. Поэтому имеет смысл минимизировать использование директивы #include, в частности включения одних заголовочных файлов в другие. mayorovp 20.11.12 в 05:30 |
||
|
Вы можете значительно уменьшить количество заголовочных файлов, которые вам нужно включить в свои заголовочные файлы, используя предварительные объявления. Например, если ваш заголовочный файл использует класс File так, что ему не требуется доступ к объявлению класса File, ваш заголовочный файл может просто предварительно объявить class File; вместо использования #include "file/base/file.h". Dynorth 19.11.12 в 19:35 |
||
|
Когда мы можем использовать класс Foo в заголовочном файле без доступа к его объявлению? Dynorth 19.11.12 в 19:35 |
||
|
Мы можем объявлять члены данных типа Foo* или Foo&. Dynorth 19.11.12 в 19:36 Мы можем объявлять поля типа Foo* или Foo& mayorovp 20.11.12 в 05:31 |
||
|
Мы можем объявлять (но не определять) функции с аргументами и/или возвращаемыми значениями типа Foo (Единственное исключение — когда аргумент Foo или const Foo& имеет неявный конструктор с одним аргументом, в таком случае необходимо предоставить полное определение для поддержки автоматического преобразования типа). Dynorth 19.11.12 в 19:38 |
||
|
Мы можем объявлять статические члены данных типа Foo, так как статические члены данных определяются вне определения класса. Dynorth 19.11.12 в 19:39 Мы можем объявлять статические поля типа Foo, так как статические поля определяются вне определения класса. mayorovp 20.11.12 в 05:33 |
||
|
С другой стороны, вы должны включить заголовочный файл, содержащий Foo, если ваш класс наследуется от Foo или имеет член данных типа Foo. Dynorth 19.11.12 в 19:39 С другой стороны, вы должны включить заголовочный файл, содержащий Foo, если ваш класс наследуется от Foo или имеет поле типа Foo. mayorovp 20.11.12 в 05:34 |
||
|
Иногда есть смысл иметь члены-указатели (или, лучше, scoped_ptr) вместо членов-объектов. Однако, это усложняет читабельность кода и уменьшает производительность, так что не следует этого делать лишь с целью минимизации включений в заголовочные файлы. Dynorth 19.11.12 в 19:42 Иногда есть смысл иметь поля-указатели (или, лучше, scoped_ptr) вместо полей-объектов. Однако, это усложняет читаемость кода и уменьшает производительность, так что не следует так делать лишь с целью минимизации включений в заголовочные файлы. mayorovp 20.11.12 в 05:35 |
||
|
Само собой, .cc-файлы обычно требуют определения классов, используемых в них, и обычно включают несколько заголовочных файлов. Dynorth 19.11.12 в 19:42 |
||
|
Заметка: если вы используете символ Foo в вашем коде, вам следует добавить определение для Foo самим, либо с помощью #include, либо с помощью предварительного объявления. Не полагайтесь на введение символа с помощью заголовочного файла, не включенного напрямую. Единственное исключение — когда Foo использован в myfile.cc, можно включать (или предварительно объявлять) Foo в myfile.h вместо myfile.cc. Dynorth 19.11.12 в 19:46 |
