我有一个“a $$中的痛苦”任务来提取/解析main()函数中调用的所有标准C函数。例如:printf,fseek等......
目前,我唯一的计划是读取main()中的每一行,并通过检查我将定义的标准C函数列表来搜索是否存在标准C函数(#define CFUNCTIONS“printf ...” )
如你所知,有很多标准C函数,所以定义所有这些函数会非常烦人。
关于如何检查字符串是否为标准C函数的任何想法?
答案 0 :(得分:1)
如果您听说过cscope,请尝试查看它生成的数据库。 cscope前端有指令可列出给定函数调用的所有函数。
如果查看main()中的调用列表,您应该可以大大缩小工作范围。
如果您必须手动解析,我建议从包含的标准标题开始。他们应该对你在main()中看到哪些函数给你一个体面的想法。
无论哪种方式,这项工作听起来都非常重要而且很有趣。
答案 1 :(得分:1)
解析C源代码乍一看似乎很简单,但正如其他人所指出的那样,程序员使用#define
和#include
s远离皮带的可能性相当普遍。除非知道要解析的特定程序在文本替换方面是温和的,否则解析任意C源代码的复杂性是相当大的。
考虑使用较少但更有效的解析对象模块的策略。编译源模块,但不要链接它。为了进一步简化,重新处理包含main的文件以删除所有其他函数,但在其位置保留声明。
根据要求,有两种方法可以完成任务:
nm
列出了带有U
。答案 2 :(得分:0)
首先,任务可能看起来很简单,但为了真正100%确定你需要解析C文件。仅查找名称是不够的,您还需要知道上下文,即何时检查id,首先当您确定id是一个函数时,您可以检查它是否是标准的c-runtime函数。
(加上我想这会让任务变得更有趣: - )
答案 3 :(得分:0)
我认为没有任何方法可以定义标准C函数列表来完成您的任务。但它比那更烦人 - 考虑宏, 例如:
#define OUTPUT(foo) printf("%s\n",foo)
main()
{
OUTPUT("Ha ha!\n");
}
因此,您可能希望在检查之前通过预处理器运行代码 从main()调用哪些函数。然后你可能会遇到这样的情况:
some_func("This might look like a call to fclose(fp), but surprise!\n");
因为字符串文字,所以你可能需要一个完整的解析器来严格执行此操作 可能跨越多行。
我不会提出三元组......那只是毫无意义的虐待狂。 :-)无论如何,祝你好运,编码愉快!