Как выбрать только нужные заголовки Qt? - PullRequest
0 голосов
/ 12 октября 2018

В большом проекте Qt, в котором много Qt и заголовков проекта включены в каждый файл, легко:

  1. включить дополнительные файлы Qt, которые не нужно включать, потому чтоони уже включены в другой файл Qt (например, qbytearray.h включен в qstring.h).
  2. не забудьте включить необходимые файлы Qt, потому что они уже включены в другие включенные файлы проекта (например,компилятор находит qstring.h, включенный в другой из ваших файлов, и не жалуется).
  3. оставил включенные дополнительные файлы Qt, которые больше не нужны после модификации.

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

Правило кажется простым: включайте только все, что вам нужно, и не зависите от других включаемых файлов на случай, если они изменятся в будущем (например, qstring.h не может использоватьсяqbytearray.h больше, что также верно для файлов проекта), но это не так легко достичь.И Qt Creator не сильно помогает в этом, потому что когда вы начинаете писать QStr..., он автоматически завершается с QString и компилируется, и вы даже не удивляетесь, почему и не подумаете о включении заголовка.

Есть ли список зависимостей заголовков Qt, или автоматический инструмент Qt, или правило, или что-то еще, чтобы убедиться, что я выбрал все нужные мне заголовки и больше ничего?Вопрос общий к C / C ++, способу получения оптимальной зависимости заголовка.

1 Ответ

0 голосов
/ 12 октября 2018

Эмпирические правила для минимизации количества считываемых включаемых файлов:

  1. Файл .cpp обычно имеет связанный заголовок.Этот заголовок должен быть включен первым - он гарантирует, что заголовок скомпилируется сам по себе и не пропускает никаких зависимостей.

  2. Для любой иерархии классов включайте только заголовки самого производного класса.Например, если вы включите <QLabel>, вам не понадобятся ни <QFrame>, ни <QWidget>, ни <QObject>.Если вы включите <QGraphicsView> и <QLabel>, вам не понадобятся ни <QAbstractScrollArea>, ни <QFrame>, ни <QWidget>, ни <QObject>.И т. Д.

  3. В отличие от предыдущего правила, не зависят от "файлов, включенных в другие файлы".Т.е. QString, включая QByteArray, является подробностью реализации, а API QString не гарантирует такого включения.

Эмпирические правила для минимизации количества скомпилированных исходных файлов:

  1. Сократите количество скомпилированных файлов на два (!!), добавив #include "foo.moc" в конце каждого foo.cpp, который реализует новые типы QObject.

  2. Короткие классы (всего <250 строк) содержатся в одном файле <code>.h, нет необходимости разделять их между .h и .cpp.

...