2011-12-22 2 views
5

Мне было интересно, если есть инструмент (возможно, компилятор GNU C++), чтобы получить из .cpp-файла полный функций .hpp-файл с указанными декларациями функций.Как извлечь декларации (файл .hpp) из реализации (файл .cpp)?

Пример:

у меня есть:
magic.cpp

int foo() { return 42; } 
char bar() { return 'z'; } 

И я хотел бы получить это после применения замечательного инструмента:
magic.hpp

int foo(); 
char bar(); 
+0

возможно дубликат [Искомый код заглушки генератора (из заголовочных файлов)] (HTTP: // StackOverflow .com/questions/2020568/seek-code-stub-generator-from-header-files) –

+0

Поиск и замена '{' с ';/*' и '}' с помощью '* /' будет делать это, хорошее решение. – Pubby

+0

@ Тим: Это наоборот, не? – Xeo

ответ

3

См. Dehydra or Treehydra. Один из этих двух инструментов позволит вам выполнить это через GCC.

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

2

Для этого вам необходим полный анализатор синтаксического анализатора и имени C++, поскольку вам нужны не только объявления функций, но и контекст, который делает их четкими. Например, если у вас есть заявление

void foo<T>(...){ ... } 

в файле, и есть тип T в файле, то лучше сохранить декларацию за Т, и все заявления, которые используются для определения T, и т.д. Таким образом, у вас есть сохраняйте в сети определения , поддерживающие foo ... и вам нужно решить, хотите ли вы сохранить те, которые поступают из файлов include или нет.

Наш DMS Software Reengineering Toolkit - это универсальный инструмент для анализа и преобразования программ общего назначения. С его C++ Front End можно проанализировать код C++ (включая #includes), построить абстрактные деревья синтаксиса (AST), разрешить имена и типы из коробки. Код настройки затем определит необходимую сеть ссылок и для каждой ссылки преобразует ее в подпись (вместо реализации), если необходимо, путем применения source-to-source program transformations к AST. Симпатичный принтер DMS может затем подготовить окончательный текст вывода.

DMS был использован для крупномасштабных разработок C++ (re) для других крупных проектов.

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

+0

Отличный ответ! Мне было интересно, что это непросто. Но я никогда бы не подумал, что он не решен в мире с открытым исходным кодом. Прямо сейчас, я пишу код для проекта курса для моего университета, поэтому то, что вы предлагаете мне, вне диапазона. Однако это кажется правильным инструментом. Я буду ждать более общего и общедоступного решения, но если этого не произойдет, я думаю, что это лучшее решение. – msemelman

4

На Debian основе распределений:

apt-get install cproto 

Затем cproto magic.cpp дает следующий результат:

/* magic.cpp */ 
int foo(void); 
char bar(void); 
+0

Waw! отличный ответ! – msemelman

+0

О нет, он работает только для C (простой C). Я искал инструмент C++. Спасибо, в любом случае! – msemelman

+0

Извините, что тогда я не знал. –

Смежные вопросы