Один из моих предыдущих коллег написал огромный заголовочный файл, содержащий около 100 нечетных структур со встроенными определениями функций-членов. Этот структурный файл включен в большинство реализаций классов (cpp-файлы) и заголовочных файлов (не знаю, почему мой коллега не использовал предварительные объявления)
Чтение такого огромного заголовочного файла — это не только кошмар, но и трудности с отслеживанием проблем из-за жалоб компилятора на множественные определения и циклические ссылки. Общий процесс компиляции также очень медленный.
Чтобы исправить многие такие проблемы, я перенес включение этого заголовочного файла из других заголовочных файлов в файлы cpp (где это возможно) и использовал предварительные объявления только соответствующих структур. Тем не менее, я продолжаю получать странные множественные ошибки определения, такие как «фатальная ошибка LNK1169: обнаружен один или несколько кратно определенных символов».
Сейчас я обдумываю, следует ли мне реорганизовать этот заголовочный файл структуры и разделить объявление и определение структуры в отдельных файлах h / cpp для каждой структуры. Хотя это будет болезненным и трудоемким делом без инструментов рефакторинга в Visual Studio, это хороший подход для решения таких проблем?
PS: Этот вопрос связан со следующим вопросом: Несколько классов в файле заголовка против одного файла заголовка на класс
Когда вы сталкиваетесь с таким серьезным рефакторингом, как этот, вы, скорее всего, будете использовать один из следующих подходов: рефакторинг оптом или делать это постепенно.
Преимущество массового выполнения состоит в том, что вы будете проходить код очень быстро (по сравнению с пошаговым), однако, если вы столкнетесь с какой-либо ошибкой, может пройти много времени, прежде чем вы ее исправите.
Делая это постепенно и разделяя классы по одному, вы уменьшаете риск ошибок, отнимающих много времени, однако это займет больше времени.
Лично я бы попробовал объединить 2 подхода:
То, что я уже нашел полезным для создания самодостаточных заголовочных файлов, — это прекомпиляция ваших заголовков. Эта компиляция не удастся, если вы не включили правильные данные.
Других решений пока нет …