Подтвердить что ты не робот

Рефакторинг кода на С++ для использования форвардных объявлений

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

Это довольно трудоемкий процесс, и я ищу инструмент, который мог бы помочь мне выяснить, какие заголовки имеют члены, которые могут быть объявлены вперед.

Есть ли параметр компилятора, который мог бы выпустить предупреждение или предположение о том, что следующий код может использовать декларацию forward? Я использую следующие компиляторы icc, gcc, sun studio и HP aCC

Есть ли отдельный инструмент, который мог бы выполнять ту же работу?

#include "Foo.h"
...//more includes

class Bar {
.......
private:
    Foo* m_foo;
};
4b9b3361

Ответ 1

Все, что связано с точным анализом С++, требует, по существу, всего С++ переднего конца где-то (иначе вы не получите ответы, или они будут неправы, и это плохо работает, когда у вас есть "довольно большие" приложения). Здесь не так много практических ответов.

Уже упоминалось, что GCCXML является пакетом, созданным на основе GCC, поэтому он имеет необходимый интерфейс С++. Он создает XML, поэтому он будет генерировать LOT-выход, который вам нужно будет прочитать, чтобы сформировать "структуру данных в памяти", предложенную в другом ответе. Его неудача в том, что GCCXML уже создает эту структуру данных памяти, а затем экспортирует ее как XML и заставляет ее строить ее снова. Конечно, вы можете просто использовать GCC, который строит структуру данных в памяти, но тогда вам нужно взломать GCC, чтобы быть тем, что вы хотите, и это действительно, действительно хочет быть компилятором. Это означает, что у вас будет драка на ваших руках, чтобы согнуть ее по вашей воле (и объясняет, почему существует GCCXML: большинство людей не хотят этого боя).

Не упоминается интерфейс Edison Design Group С++ (EDG), который строит непосредственно в структуре данных памяти. Это передний конец; вам придется делать все аналитические материалы самостоятельно, но ваша задача может быть достаточно простой, так что это не сложно.

Последнее решение, которое я знаю, принадлежит мне: С++ FrontEnd для DMS. DMS является основой для разработки анализа программ, а его С++ FrontEnd является полным интерфейсом для С++ (например, делает все, что делает фронт GCC и Edison: разбор, построение дерева, разрешение имени/типа). И вам придется запрограммировать свой специальный анализ так же, как и для GCCXML и EDG, перейдя по "в памяти" datastructures, созданным DMS.

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

Ответ 2

Я не уверен, что вы найдете что-нибудь, что делает это из коробки, но одним из вариантов было бы написать script с помощью Python и pygccxml, который мог бы выполнить некоторые из этих анализов для вас.

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

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

Недостатком является то, что script потребуется некоторое время, чтобы получить право, чтобы стоимость могла перевесить преимущества, но это было бы интересным упражнением, по крайней мере. Вы можете опубликовать свой код в Github, если у вас есть что-то, что сработало, и, возможно, другие сочтут это полезным.

Ответ 3

Что вы можете сделать, это вызвать gcc с -MM. Это создаст файлы зависимостей, которые Make может читать. Вместо того, чтобы использовать их, вы можете проанализировать их (с помощью perl или что-то еще), чтобы определить, какие из них необходимы, и которые можно заменить декларациями вперед.