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