如何从实现文件(.cpp文件)中提取声明(.hpp文件)?

5
我想知道是否有一种工具(可能是GNU C++编译器),可以从一个充满函数的.cpp文件中获取一个包含所述函数声明的.hpp文件。 示例:
我有: magic.cpp
int foo() { return 42; }
char bar() { return 'z'; }

应用神奇的工具magic.hpp后,我希望获得以下内容:
int foo();
char bar();

可能是[寻找代码存根生成器(从头文件)]的重复问题(https://dev59.com/5XI-5IYBdhLWcg3wFkOO)。 - user142162
搜索并替换 {;/*}*/ 可以解决问题,但不是一个好的解决方案。 - Pubby
@Tim:这不是相反的吗? - Xeo
@TIM 是的,Xeo是正确的,你展示给我们的是另一种方式,我已经有了存根。 - msemelman
@PubbY 嗯,我在寻找更自动化的东西。如果我有定义或包含文件怎么办? - msemelman
3个回答

4

在基于Debian的发行版中:

apt-get install cproto

然后cproto magic.cpp会得到以下输出:

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

哦,不好意思,它只适用于C语言(纯C)。我正在寻找一个C++工具。无论如何,还是谢谢! - msemelman
抱歉,那我不知道。 - Eduardo Ivanec

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

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


2
为了准确地完成这个任务,你需要一个完整的 C++ 解析器和名称解析器,因为你不仅需要函数声明,还需要使它们明确定义的上下文。例如,如果你有一个声明:
 void foo<T>(...){ ... }

在文件中,如果有一个类型T,最好保留对T的声明以及用于定义T的所有声明等。因此,您必须维护支持foo的定义网络,并决定是否保留来自包含文件的定义。
我们的DMS软件重构工具包是可定制的通用程序分析和转换机器。使用其C++前端,可以解析C++代码(包括#includes),构建抽象语法树(AST),并立即解析名称和类型。然后,定制化代码将确定所需的引用网络,并针对每个引用通过应用源到源程序转换将其转换为签名(而不是实现)(应用于AST)。 DMS的漂亮打印机随后可以生成最终输出文本。
DMS已用于其他大型项目的C ++(重新)工程。
当然,如果您不介意可能需要手动修补答案的情况,您总是可以编写一些糟糕的黑客来模拟这个过程。

好答案!我一直在想这不容易。但我从未想过这在开源世界中得不到解决。现在,我正在为我的大学课程项目编写代码,所以你提供给我的超出了范围。然而,它似乎是正确的工具。我会等待更适合大众使用的解决方案,但如果那从未发生,我认为这是最好的可用解决方案。 - msemelman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接