Рефакторинг C++ кодирует для использования предописаний

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

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

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

Существует ли автономный инструмент, который мог сделать то же задание?

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

class Bar {
.......
private:
    Foo* m_foo;
};
19
задан Glen 19 February 2010 в 16:32
поделиться

3 ответа

Насколько я понимаю, шатер устарел, и IE8 может быть версия IE, которую Microsoft решила полностью исключить из поддержки этого тэга. Даже если вы найдете способ заставить его работать, я бы предложил использовать другой метод, чтобы получить текст для прокрутки (если это то, что необходимо), потому что у вас, вероятно, будет та же проблема в следующей версии, если IE.

ПРАВКА: Вы можете попробовать java скрипт... после быстрого поиска я нашел этот сайт, который выглядит, как он будет генерировать код для вас. Кроме того, поскольку это javascript он должен теперь также работать на Firefox, Chrome и т.д. http://rumkin.com/tools/marquee/

-121--2764387-

Добавьте OnItemSelectedListener для каждого устройства вращения после установки любого предыдущего значения в onResume .

-121--1855956-

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

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

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

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

3
ответ дан 30 November 2019 в 05:17
поделиться

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

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

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

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

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

4
ответ дан 30 November 2019 в 05:17
поделиться

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

3
ответ дан 30 November 2019 в 05:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: