在C#中解析C头文件

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

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

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

许多人会建议“编写自己的解析器(用于C)”。 大多数人没有这样做; 它做了很多工作,并且比他们理解的更好。 如果您没有使用生产级别的机器,那么在不修复所有内容的情况下,您将无法获得真正的C头文件。

解析普通C很难; 考虑解析模糊短语的问题

T*X; 

经典的解析器无法在没有额外hackery的情况下解析它 。

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

您最好先获得预先存在的预先测试的机器,以便为您完成此操作。 考虑到Clang是一种选择,虽然我不确定它是否处理MS头文件。 GCC是一种选择,但它真的,真的想成为一个编译器,而不是你当地友好的C源代码分析工具,而且我不确定它对C语言的MS方言的支持。我们的DMS软件再造工具包全部上述各种MS方言的C.

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

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