查找定义C函数的头文件

时间:2009-05-03 04:56:31

标签: c header openafs

不应该很难,对吗?正确?

我目前正在搜索OpenAFS代码库以查找pioctl的标头定义。我抛出了我所拥有的一切:检查了ctags,grepped pioctl的源代码,等等。我最接近领导的事实是有一个文件pioctl_nt.h包含定义,除了它的实际上并不是我想要的,因为没有任何用户空间代码直接包含它,而且它是Windows特定的。

现在,我不希望你去下载OpenAFS代码库并为我找到头文件。不过我很好奇:当其他一切都失败时,你找到所需头文件的技巧是什么?什么是最糟糕的情况可能会导致代码库中的pioctl的grep实际上没有出现任何看起来像函数定义的东西?

我还应该注意,我可以访问两个已经正确完成它的独立用户空间程序,所以理论上我可以对该函数进行O(n)搜索。但是没有一个头文件弹出给我,而且n很大......

编辑:即时问题已经解决:pioctl()是隐式定义的,如下所示:

AFS.xs:2796: error: implicit declaration of function ‘pioctl’

6 个答案:

答案 0 :(得分:4)

如果grep -rctags失败,那么它可能被定义为一些令人讨厌的宏的结果。您可以尝试创建调用pioctl()并编译成功的最简单文件,然后对其进行预处理以查看会发生什么:

gcc -E test.c -o test.i
grep pioctl -C10 test.i

答案 1 :(得分:2)

有一些编译器选项可以显示预处理器输出。试试那些?在一个可怕的捏点,我的头完全没有任何可能的定义-E选项(在大多数c编译器中)除了喷出预处理的代码之外什么都不做。

每个请求的信息:通常我只是捕获有问题的文件的编译,因为它在屏幕上输出做快速复制并粘贴并在编译器调用后立即放入-E。结果将预处理器输出喷射到屏幕,以便将其重定向到文件。查看该文件,因为已经处理了所有宏和愚蠢的事情。

最糟糕的情况:

  • K& R风格原型
  • 宏隐藏了定义
  • 隐含声明(根据您的回答)

答案 2 :(得分:1)

您是否考虑过使用cscope(可从SourceForge获得)?

我在一些相当重要的代码集上使用它(25,000多个文件,文件中最多约20,000行)并取得了很好的成功。在古代的Sun E450上构建交叉引用需要一段时间才能获得文件列表(5-10分钟)和更长时间(20-30分钟),但我发现结果很有用。


在几乎同样古老的Mac(双1GHz PPC 32位处理器)上,在OpenAFS(1.5.59)源代码上运行的cscope会出现很多声明函数的地方,有时是代码内联,有时在标题中。扫描4949文件花了几分钟,生成一个58 MB的cscope.out文件。

  • 的OpenAFS-59年5月1日/ SRC / SYS / sys_prototypes.h
  • openafs-1.5.59 / src / aklog / aklog_main.c(以及评论“为什么AFS不提供这些原型?”)
  • 的OpenAFS-59年5月1日/ SRC / SYS / pioctl_nt.h
  • openafs-1.5.59 / src / auth / ktc.c包含PIOCTL的定义
  • openafs-1.5.59 / src / sys / pioctl_nt.c提供了它的实现
  • openafs-1.5.59 / src / sys / rmtsysc.c提供了它的实现(有时候是afs_pioctl())

发现的184个实例中的其余部分似乎是使用函数,文档引用,发行说明,更改日志等。

答案 3 :(得分:0)

我们决定在预处理器上找不到任何东西后,我们已经决定的当前工作原理是OpenAFS让编译器推断函数的原型,因为它返回一个整数并取指针,整数,指针,整数作为其参数。我将通过自己定义它来解决这个问题。

修改:非常好!我找到了吸烟枪:

AFS.xs:2796: error: implicit declaration of function ‘pioctl’

答案 4 :(得分:0)

虽然原始的一般问题已经得到解答,但是如果有人到达此页面,想知道在哪里找到定义pioctl的头文件:

在当前版本的OpenAFS(1.6.7)中,pioctl的原型在sys_prototypes.h中定义。但是,这个问题最初被问到的时间,该文件不存在,并且没有从OpenAFS代码树外部可见的pioctl原型。

然而,pioctl的大多数用户可能想要或者至少可以使用lpioctl(“local”pioctl),它总是在本地机器上发出系统调用。 afssyscalls.h中有一个原型(现在也是sys_prototypes.h)。

这些天最简单的选择就是使用libkopenafs。为此,包括kopenafs.h,使用函数k_pioctl,并链接-lkopenafs。与尝试与OpenAFS libsys和其他东西链接相比,这往往是一个更方便的界面。

答案 5 :(得分:-1)

它通常在手册页简介中说出来吗?