我想知道是否有一个工具(也许GNU C++编译器)从一个.cpp文件中获取 完整的函数.hpp文件与提到的函数声明。如何从实现(.cpp文件)中提取声明(.hpp文件)?
例:
我:
magic.cpp
int foo() { return 42; }
char bar() { return 'z'; }
而且我想运用奇妙的工具后获得这样的:
magic.hpp
int foo();
char bar();
我想知道是否有一个工具(也许GNU C++编译器)从一个.cpp文件中获取 完整的函数.hpp文件与提到的函数声明。如何从实现(.cpp文件)中提取声明(.hpp文件)?
例:
我:
magic.cpp
int foo() { return 42; }
char bar() { return 'z'; }
而且我想运用奇妙的工具后获得这样的:
magic.hpp
int foo();
char bar();
请参阅Dehydra or Treehydra。这两个工具中的一个应该允许您通过GCC执行此操作。
Dehydra是一款轻量级,可编写脚本的通用静态分析工具,能够对C++代码进行特定于应用程序的分析。
要准确地做到这一点,你需要一个完整的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++(重新)工程。
当然,如果您不介意可能需要手动修补的答案,您总是可以编写一些不好的黑客来模拟此操作。
很好的回答!我想知道这不容易。但我永远不会认为它在开源世界没有解决。现在,我写的是为我的大学开设一门课程项目的代码,所以你给我提供的是超出范围的。但它似乎是正确的工具。我会等待一个更公众友好的解决方案,但如果这从未发生,我认为这是最好的解决方案。 – msemelman 2011-12-23 00:03:20
[求代码存根发生器(来自头文件)]的可能重复(HTTP://计算器.com/questions/2020568/seeking-code-stub-generator-from-header-files) – 2011-12-22 23:39:34
使用'/ /'搜索并替换''''/ *'和'}'会做到这一点,尽管不是好的解决方案 – Pubby 2011-12-22 23:40:34
@Tim:这是另一种方式,不是吗? – Xeo 2011-12-22 23:41:34