在 C# 中解析 C 头文件

sta*_*her 2 c# parsing

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

Ira*_*ter 5

要从深层意义上“解析”C(头文件)文件并获取函数声明的类型信息,在实践中您需要:

  • 一个完整的预处理器(包括供应商添加的 pecaddillos,MS 的标题中有一些非常奇怪的东西),
  • 一个完整的(语法)解析器/AST 构建器,用于感兴趣的 C 方言(没有“C”这样的东西;供应商在编译器的这个修订版中提供了什么)
  • 完整的符号表构造(因为 typedef 是感兴趣的实际类型的别名)

许多人会建议“编写自己的解析器(用于 C)”。大多数人没有这样做;要做到这一点并使其正确,比他们理解的要多得多。如果您不从生产级机器开始,您将无法在不修复所有内容的情况下通过真正的 C 头文件。

仅仅解析普通的 C 很困难;考虑解析歧义词组的问题

 T*X;
Run Code Online (Sandbox Code Playgroud)

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

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

您最好使用预先存在的预先测试过的机器来为您执行此操作。Clang 作为一个选项出现在我的脑海中,尽管我不确定它是否处理 MS 头文件。GCC 是一种选择,但它真的非常想成为一个编译器,而不是您本地友好的 C 源代码分析工具,而且我再次不确定它是否支持 C 的 MS 方言。我们的 DMS 软件再工程工具包拥有所有以上针对 C 的各种 MS 方言。

选择了一种工具,它实际上可以解析这样的标题,你可能会想要与收集的头信息的东西。你对你想要完成的事情含糊其辞。在同时提到 C# 和 C 之后,有一个提示是您希望从 C# 代码调用 C 程序,因此需要为 C 代码生成 C# 等效 API。为此,您将需要机器来操作所提供的类型信息,并为 C# 声明构建“文本”。为此,您可能会发现您也需要其他支持工具来完成该部分。在这里 GCC 是一个完整的非启动器;它不会为您提供额外的帮助。Clang 和 DMS 都被设计为定制工具制造机械库。

当然,这可能没有实际意义,具体取决于您要处理多少头文件文本;如果它只是一个头文件,那么手动完成它可能是最简单的。您建议您愿意这样做(“可以手动解析...”)。在这种情况下,您真正​​需要做的就是运行预处理器并解释输出。我相信您可以使用 GCC 和 Clang 甚至 MS 编译器的命令行开关;我知道 DMS 可以做到这一点。有关此处易于使用的选项,请参阅在 Visual Studio 中预处理后如何查看 C/C++ 源文件?