#import в заголовочном файле или файле реализации - PullRequest
5 голосов
/ 19 ноября 2010

Некоторые имеют привычку добавлять импорт / включение файла заголовка в файл заголовка. Некоторые, с другой стороны, пишут предварительную декларацию в заголовочном файле и записывают фактические строки #include или #import в файле реализации.

Существует ли стандартная практика для этого? Что лучше и почему?

Ответы [ 3 ]

10 голосов
/ 19 ноября 2010

Учитывая Xh и Xc, если вы #include все из Xh, тогда клиенты "X", которые #include <X.h> также будут включать все эти заголовки, хотя некоторые из них могут понадобиться только в Xc

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

Это минимизирует зависимости перекомпиляции.Вы не хотите, чтобы изменение только в реализации влияло на заголовок и, следовательно, инициировало перекомпиляцию клиента.Вы должны просто включить непосредственно из Xc

2 голосов
/ 19 ноября 2010

Включение прямых ссылок вместо заголовков необходимо, когда классы имеют мелкие зависимости. Например:

хиджры

#include "B.h"
class A {
   B* pointer;
};

B.h

#include "A.h"
class B {
   A* pointer;
};

сломается при компиляции.

хиджры

class B;
class A {
   B* pointer;
};

B.h

class A;
class B {
   A* pointer;
};

Будет работать, так как каждый класс должен знать, что другой класс существует в объявлении.

0 голосов
/ 19 ноября 2010

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

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

Я не думаю, что есть единственный ответ.Учитывая причины, которые я привел, я предпочитаю первый подход, я думаю, что он приводит к более чистому коду (хотя и более тяжелому и, возможно, с ненужным импортом).

Я не помню, кого цитирую (и, следовательно, фразуне точно), но я всегда помню, как читал: «программы написаны для людей, чтобы читать, и иногда для компьютеров, чтобы выполнить».Меня не особо волнует, есть ли несколько килобайт кода, который не понадобится пользователю моего модуля, если он может легко импортировать его и использовать с одной директивой.

Опять же,Я думаю, что это вопрос вкуса, если только я не смог что-то рассмотреть.В этом случае комментарии приветствуются!

Приветствия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...