2011-12-22 48 views
5

我想知道是否有一个工具(也许GNU C++编译器)从一个.cpp文件中获取 完整的函数.hpp文件与提到的函数声明。如何从实现(.cpp文件)中提取声明(.hpp文件)?

我:
magic.cpp

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

而且我想运用奇妙的工具后获得这样的:
magic.hpp

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

[求代码存根发生器(来自头文件)]的可能重复(HTTP://计算器.com/questions/2020568/seeking-code-stub-generator-from-header-files) – 2011-12-22 23:39:34

+0

使用'/ /'搜索并替换''''/ *'和'}'会做到这一点,尽管不是好的解决方案 – Pubby 2011-12-22 23:40:34

+0

@Tim:这是另一种方式,不是吗? – Xeo 2011-12-22 23:41:34

回答

3

请参阅Dehydra or Treehydra。这两个工具中的一个应该允许您通过GCC执行此操作。

Dehydra是一款轻量级,可编写脚本的通用静态分析工具,能够对C++代码进行特定于应用程序的分析。

2

要准确地做到这一点,你需要一个完整的C++解析器和名字解析,因为你需要的不仅是函数的声明也使他们明确的背景下。举例来说,如果你有一个声明

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

在文件中,并有一个类型T的文件中,你最好保留声明T,以及任何声明用来定义T,等等。所以你有保持 定义的网络支持foo ...并且您必须决定是否要保留包含文件的文件。

我们的DMS Software Reengineering Toolkit是可定制的通用程序分析和转换机械。通过它的C++ Front End,可以解析C++代码(包括#includes),构建抽象语法树(AST),解析开箱即用的名称和类型。然后,定制代码将确定必要的引用网页,并且对于每个引用,通过将source-to-source program transformations应用于AST,将其转换为签名(而不是实现)。 DMS的漂亮打印机可以生成最终的输出文本。

DMS已被用于其他大型项目的大规模C++(重新)工程。

当然,如果您不介意可能需要手动修补的答案,您总是可以编写一些不好的黑客来模拟此操作。

+0

很好的回答!我想知道这不容易。但我永远不会认为它在开源世界没有解决。现在,我写的是为我的大学开设一门课程项目的代码,所以你给我提供的是超出范围的。但它似乎是正确的工具。我会等待一个更公众友好的解决方案,但如果这从未发生,我认为这是最好的解决方案。 – msemelman 2011-12-23 00:03:20

4

在基于Debian的发行:

apt-get install cproto 

cproto magic.cpp然后给出以下输出:

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

Waw!很好的回答! – msemelman 2011-12-23 03:57:14

+0

哦,不,它只适用于C(普通C)。我正在寻找一个C++工具。不管怎么说,还是要谢谢你! – msemelman 2011-12-23 03:59:50

+0

对不起,那时我没有意识到。 – 2011-12-23 04:13:48

相关问题