Несколько структур, определенных в заголовочном файле - я должен переместить их в отдельные файлы h и cpp

Один из моих предыдущих коллег написал огромный заголовочный файл, содержащий около 100 нечетных структур со встроенными определениями функций-членов. Этот структурный файл включен в большинство реализаций классов (cpp-файлы) и заголовочных файлов (не знаю, почему мой коллега не использовал предварительные объявления)

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

Чтобы исправить многие такие проблемы, я перенес включение этого заголовочного файла из других заголовочных файлов в файлы cpp (где это возможно) и использовал предварительные объявления только соответствующих структур. Тем не менее, я продолжаю получать странные множественные ошибки определения, такие как "фатальная ошибка LNK1169: найден один или несколько кратно определенных символов".

Сейчас я обдумываю, следует ли мне реорганизовать этот заголовочный файл структуры и разделить объявление и определение структуры в отдельных файлах h / cpp для каждой структуры. Хотя это будет болезненным и трудоемким делом без инструментов рефакторинга в Visual Studio, это хороший подход для решения таких проблем?

PS: Этот вопрос связан со следующим вопросом: несколько классов в файле заголовка против одного файла заголовка на класс

1 ответ

Решение

Когда вы сталкиваетесь с таким серьезным рефакторингом, как этот, вы, скорее всего, будете использовать один из следующих подходов: рефакторинг оптом или делать это постепенно.

Преимущество массового выполнения состоит в том, что вы будете проходить код очень быстро (по сравнению с пошаговым), однако, если вы столкнетесь с какой-либо ошибкой, может пройти довольно много времени, прежде чем вы ее исправите.

Делая это постепенно и разделяя классы по одному, вы уменьшаете риск ошибок, отнимающих много времени, однако это займет больше времени.

Лично я бы попробовал объединить 2 подхода:

  • Разделить каждый класс, один за другим (сверху вниз) на разные единицы перевода
  • Однако, сохраняя основной включаемый файл, и заменяя все перемещенные, включенные включенными
  • После этого вы можете удалить включения в этот основной заголовочный файл и заменить их на единственные классы.
  • Наконец, удалите основной заголовочный файл

То, что я уже нашел полезным для создания самодостаточных заголовочных файлов, - это прекомпиляция ваших заголовков. Эта компиляция не удастся, если вы не включили правильные данные.

Другие вопросы по тегам