查找定义C函数的头文件

应该不难,对吗?对? 我目前正在搜索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’
    
已邀请:
如果
grep -r
ctags
失败,那么它可能被定义为一些令人讨厌的宏的结果。您可以尝试制作最简单的文件,调用
pioctl()
并成功编译,然后预处理它以查看会发生什么:
gcc -E test.c -o test.i
grep pioctl -C10 test.i
    
有编译器选项来显示预处理器输出。试试那些?在一个可怕的捏,我的头完全没有任何可能的定义-E选项(在大多数c编译器中)除了喷出预处理的代码之外什么都不做。 每个请求的信息:通常我只是捕获有问题的文件的编译,因为它在屏幕上输出快速复制并粘贴并在编译器调用后立即放入-E。结果将预处理器输出喷射到屏幕,以便将其重定向到文件。查看该文件,因为所有的宏和愚蠢的事情都已经处理好了。 最坏的情况: K& R风格原型 宏正在隐藏定义 隐含声明(根据你的答案)     
您是否考虑过使用
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年1月5日/ src目录/ SYS / sys_prototypes.h openafs-1.5.59 / src / aklog / aklog_main.c(以及评论“为什么AFS不提供这些原型?”) OpenAFS的 - 59年1月5日/ 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个实例中的其余部分似乎是使用函数,文档引用,发行说明,更改日志等。     
我们决定在预处理器上找不到任何东西后,我们已经决定的当前工作原理是OpenAFS让编译器推断出函数的原型,因为它返回一个整数并取指针,整数,指针,整数作为其参数。我将通过自己定义它来解决这个问题。 编辑:太棒了!我找到了吸烟枪:
AFS.xs:2796: error: implicit declaration of function ‘pioctl’
    
虽然原始的一般问题已得到解答,但如果有人到达此页面,想知道在哪里找到定义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和其他东西链接相比,这往往是一个更方便的界面。     
难道它通常在手册页简介中说出来吗?     

要回复问题请先登录注册