Инструмент для синтаксического анализа исходного кода С++ и преобразования встроенных методов заголовка в исходный файл .cpp?

Исходный код нашего приложения - сотни тысяч строк, тысячи файлов, а местами очень старые - приложение было впервые написано в 1995 или 1996 году. За последние несколько лет моя команда значительно улучшила качество источник, но остается одна проблема, особенно ошибка: у многих классов есть много методов, полностью определенных в их заголовочном файле.

У меня нет проблем с методами, объявленными inline в заголовке в некоторых случаях - конструктором структуры, простым методом, в котором inlining измеримо делает его быстрее (у нас есть некоторые математические функции, подобные этому) и т.д. Но либеральное использование встроенных методов без видимых причин:

  • Грязный
  • Трудно найти реализацию метода (особенно поиск по дереву классов для виртуальной функции, только для поиска одного класса была указана его версия в заголовке...)
  • Вероятно, увеличивает размер скомпилированного кода
  • Вероятно, проблемы для нашего компоновщика печально известны для больших кодовых баз. Справедливости ради, за последние несколько лет он стал намного лучше, но он не идеален.

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

Наша кодовая база огромна. Есть ли автоматизированный инструмент, который может сделать (для большинства) это для нас?

Примечания:

  • Мы используем Embarcadero RAD Studio 2010. Другими словами, диалект С++ включает VCL и другие расширения и т.д.
  • Несколько заголовков являются автономными, но большинство из них сопряжено с соответствующим .cpp файлом, как обычно. Помимо расширения, имя файла одинаков, то есть, если есть методы, определенные в X.h, их можно перенести на X.cpp. Это также означает, что инструмент не должен обрабатывать синтаксический анализ всего проекта - возможно, он может просто анализировать отдельные пары файлов .cpp/.h, игнорировать включенные и т.д., Если он может надежно распознавать метод с определенным телом в объявлении класса и переместить его.

Ответ 1

Вы можете попробовать Lazy С++. Я не использовал его, но я считаю, что это инструмент командной строки, который сделает именно то, что вы хотите.

Ответ 2

Если код работает, я бы проголосовал против любого крупного автоматизированного переписывания.
Много работы могло бы быть связано с его исправлением.

Небольшие итеративные улучшения со временем - лучший метод, так как вы сможете тестировать каждое изменение в изоляции (и добавлять модульные тесты). В любом случае ваша главная жалоба на то, что вы не можете найти код, не является реальной проблемой и уже решена. Уже есть инструменты, которые будут индексировать вашу базу кода, чтобы ваш редактор перешел к правильному определению функции, не требуя его поиска. Взгляните на ctags или эквивалент для вашего редактора.

  • Беспокойство

    Субъективное

  • Сложно найти реализацию метода (особенно поиск по дереву классов для виртуальной функции, только для поиска одного класса была указана его версия в заголовке...)

    Уже имеются инструменты для поиска функции. ctags создаст файл, который позволит вам перейти непосредственно к функции из любого подходящего редактора (vim/emacs). Я уверен, что ваш редактор, если один из них имеет эквивалентный инструмент.

  • Вероятно, увеличивается размер скомпилированного кода

    Вряд ли. Компилятор выберет встроенную или не основанную на внутренних показателях, а не погоду, она будет помечена в исходном тексте.

  • Наверное, вызывает проблемы для нашего компоновщика, который, как известно, неровный для больших кодовых баз. Справедливости ради, за последние несколько лет он стал намного лучше, но он не идеален.

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

Ответ 3

У вас есть ряд проблем для решения:

  • Как наилучшим образом перегруппировать файлы источника и заголовка
  • Как автоматизировать модификации кода, чтобы выполнить это.

В обоих случаях вам нужен надежный синтаксический анализатор С++ с полным разрешением имен, чтобы точно определить зависимости.

Затем вам нужны механизмы, которые могут надежно модифицировать исходный код С++.

Наш DMS Software Reengineering Toolkit с его С++ Front End. DMS используется для крупномасштабной реструктуризации кода на С++; см. http://www.semdesigns.com/Company/Publications/ и отследить первую статью "Пример: реконструирование моделей компонентов С++ с помощью автоматической трансформации программы". (Там более старая версия этой статьи вы можете скачать оттуда, но опубликованный лучше). AFAIK, DMS - единственный инструмент, который когда-либо применялся для преобразования С++ в больших масштабах.

Эта SO-дискуссия о реорганизации кода напрямую затрагивает проблему группировки.

Ответ 4

XE2 включает новый статический анализатор. Возможно, стоит попробовать новую версию С++ Builer.