在c#中解析C头文件

本文关键字:文件 | 更新日期: 2023-09-27 18:12:38

我正在使用Visual Studio c#,我需要解析C头文件以仅提取有关其中包含的函数声明的信息。对于每个函数,我需要名称、返回类型及其参数。如果可能的话,我希望参数按照它们在函数声明中出现的顺序排列。我在网上看到一些关于使用visual studio标签或Exhuberant标签等的内容。但从我收集到的信息来看,这些并不是真正让我用c#代码执行c#程序解析的选项(我可能搞错了?)我也浏览了所有其他相关问题的答案,但它们似乎并不真正适用于我的情况(我可能只是愚蠢)。如果我至少可以得到表示函数声明的所有代码行,我就有了一个良好的开端,并且可以自己手动解析其余的代码行。提前感谢

在c#中解析C头文件

要深入地"解析" C(头)文件,并为函数声明获取类型信息,在实践中您需要:

  • 一个完整的预处理器(包括供应商添加的pecaddillos, MS在他们的头文件中有一些非常奇怪的东西),
  • 一个完整的(语法)解析器/AST构建器,用于感兴趣的C方言(没有"C"这样的东西;这是供应商提供的编译器版本)
  • 一个完整的符号表构造(因为类型定义是实际类型的别名)
许多人会建议"编写自己的解析器(用于C语言)"。大多数人都没有这样做;要做到这一点,并把它做好,比他们理解的要多得多。如果你不从生产级的机器开始,你将无法完成真正的C头文件而不修复它。

解析普通的C语言很难;考虑解析歧义短语

的问题
 T*X;

如果没有额外的hack,经典解析器无法解析这个。

一般来说,您也不能单独解析C头文件。您需要有包含它的源代码上下文(通常包括编译器命令行),否则特定头文件中的类型定义,预处理器条件和宏将是未定义的,因此无法扩展为编译器通常看到的有效C语言。

你最好得到预先存在的预先测试的机器,它会为你做这件事。Clang作为一个选项出现在我的脑海中,尽管我不确定它是否处理MS头文件。GCC是一种选择,但它真的,真的想成为一个编译器,而不是你本地友好的C源代码分析工具,而且我不确定它是否支持MS方言的C。我们的DMS软件重构工具包有上述所有的MS方言的C。

选择了可以实际解析此类头信息的工具后,您可能希望对收集的头信息执行操作。你对自己想要完成的事情含糊其辞。在同时提到c#和C之后,这里有一个提示,您希望从c#代码调用C程序,因此需要为C代码生成c#等效的api。为此,您将需要一些机制来操作所提供的类型信息,并为c#声明构建"文本"。为此,您可能会发现还需要其他支持工具来完成该部分。在这里,GCC是完全行不通的;它不会给你提供额外的帮助。Clang和DMS都被设计为定制工具构建机械库。

当然,这可能都没有意义,这取决于你想要处理多少头文件文本;如果只有一个头文件,手动操作可能是最简单的。您建议您愿意这样做("可以手工解析…")。在这种情况下,您真正需要做的就是运行预处理器并解释输出。我相信你可以使用GCC和Clang甚至MS编译器的命令行开关;我知道DMS可以做到。关于这里容易获得的选项,请参见如何在Visual Studio中预处理后看到C/c++源文件?