我正在使用Visual Studio C#,我需要解析C头文件以仅提取有关其中包含的函数声明的信息。对于每个函数,我需要名称,返回类型及其参数。如果可能的话,我希望参数按照它们在函数声明中出现的顺序排列。 我在网上看过有关使用视觉工作室标签或Exhuberant Ctags等的内容。但是从我收集到的内容中,这些并不是真正的选项,让我用C#代码执行C#程序的解析(我可能是错误?)。我也查看了相关问题的所有其他答案,但它们似乎并不适用于我的情况(我可能只是愚蠢)。 如果我至少可以获得代表函数声明的所有代码行,那么我有一个良好的开端并且可以自己手工解析其余部分。 提前致谢
答案 0 :(得分:2)
解析"解析"深层意义上的C(头文件)文件并获取函数声明的类型信息,实际上你需要:
许多人会建议"编写自己的解析器(针对C)"。大多数人都没有做到这一点;它做了很多工作并且比他们理解的更好。如果您不是从生产级别的机器开始,那么您无法通过真正的C头文件而无需修复所有内容。
解析普通C很难;考虑解析模糊短语的问题
T*X;
A classic parser cannot parse this without additional 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可以做到这一点。有关易于使用的选项,请参阅How do I see a C/C++ source file after preprocessing in Visual Studio?