Я пытаюсь научиться справляться с большим количеством включений, и все еще держу свой код в чистоте.
Я программирую приложение Qt, и я поместил файлы, которые обычно используются (и это не меняется), в файл с именем «Util.h».
util.h
#pragma once
#include <Core/IObserver.h>
#include <Core/Math.h>
#include <QAction>
#include <QDockWidget.h>
#include <QFileDialog>
#include <QGraphicsBlurEffect>
#include <QLabel.h>
#include <QMainWindow.h>
#include <QMenu.h>
#include <QMessageBox.h>
#include <QShortcut.h>
#include <QSignalMapper>
#include <QSound>
#include <QString>
#include <QTimer.h>
#include <QTreeView>
#include <QStandardItemModel>// Path to icons
#define ICON_PATH \
"../../Assets/GUI/Icons/"
Это я потом включаю почти во все мои заголовочные файлы
#include "Util.h"#include "Manager_Docks.h"#include "Manager_Tools.h"#include "Manager_Console.h"#include "ui_MainWindow.h"...
Я также думаю только о том, в том числе util.h в каждом .CPP только и иметь отдельный Header_Util.h для заголовочных файлов, выглядит примерно так
Header_Util.h
#pragma once
class IObserver;
class QAction;
class QDockWidget;
class QFileDialog;
...
TL; DR: как правило, лучше всего удалять ненужно видимые заголовки при разработке C ++ или C.
Есть ли лучший способ сделать это?
Это вообще очень плохая идея, когда ваш проект не маленький. Большинству источников не нужно видеть объявление большинства файлов, и это объекты высокого уровня. По крайней мере, разделите его по категориям.
Это сильно замедляет время компиляции?
Вообще-то да. Пример: нужно ли большинству ваших исходных файлов знать о библиотеке пользовательского интерфейса? Возможно нет.
Это лучшее решение?
Да. Стоимость предварительных деклараций очень и очень мала.
Кроме того, я знаю, что есть то, что называется предварительно скомпилированными заголовками, но никогда не использовал себя. Возможно, это решение моей проблемы и что-то, что я должен изучить?
Для некоторых сборок они Можно сэкономить много времени. Для других они могут только замедлить ход событий. Если вы решите использовать их, то измерьте время сборки, чтобы убедиться, что лучше для вашего проекта и включений, которые вам нужны.
Как правило, вы найдете все ваши источники не должны знать о чем-то очень высоком и большом уровне (например, библиотека GUI и уровень абстракции). Только часть источников, как правило, должна знать об этих библиотеках более высокого уровня. Это часто хороший момент, чтобы разбить вашу кодовую базу на более мелкие цели / библиотеки.
…и суммировать все вопросы. Что бы вы сделали на моем месте?
Я бы не стал складывать все эти библиотеки / заголовки высокого уровня в заголовки, чтобы все источники могли их видеть. Больно отменить в больших кодовых базах и, как правило, дорого обходится во время сборки. Заголовки, содержащие предварительные объявления, хороши.
То, что вы делаете, является обычным делом, хотя оно будет помещено в предварительно скомпилированный заголовок.
Предварительно скомпилированный заголовок (вместе с precompiled.cpp) — это просто заголовок, который будет компилироваться первым. Затем файл obj из этой компиляции может быть непосредственно включен в другие заголовки. Это препятствует тому, чтобы все ваши файлы .cpp компилировали общие заголовочные файлы и файлы cpp снова и снова. Это ускоряет время компиляции на порядки.
Настроить предварительно скомпилированный заголовок довольно просто, и для этого есть немало ресурсов.