代码之家  ›  专栏  ›  技术社区  ›  Edward Z. Yang

查找定义C函数的头文件

  •  4
  • Edward Z. Yang  · 技术社区  · 16 年前

    不应该很难,对吧?对吗?

    我目前正在搜索OpenAFS代码库以找到pioctl的头定义。我已经放弃了我所掌握的一切:检查了ctags,为pioctl添加了源代码grepped,等等。我最接近的线索是有一个包含定义的pioctl-unt.h文件,除了它实际上不是我想要的,因为没有一个用户空间代码直接包含它,而且它是特定于Windows的。

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

    我还应该注意到,我可以访问两个独立的用户空间程序,它们都做得很好,所以理论上我可以对函数进行O(N)搜索。但是没有一个头文件弹出给我,n是大的…

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

    AFS.xs:2796: error: implicit declaration of function ‘pioctl’
    
    6 回复  |  直到 11 年前
        1
  •  3
  •   Adam Rosenfield    16 年前

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

    gcc -E test.c -o test.i
    grep pioctl -C10 test.i
    
        2
  •  2
  •   ojblass    16 年前

    有编译器选项来显示预处理器输出。试试那些?在我脑子里完全没有任何可能的定义的情况下,-e选项(在大多数C编译器中)只会喷出预处理的代码。

    根据要求的信息 :通常情况下,我只是捕获问题文件的编译,因为它在屏幕上输出,快速复制和粘贴,并在编译器调用后立即放置-e。结果会将预处理器输出喷到屏幕,因此将其重定向到文件。查看这个文件,因为所有的宏和愚蠢的事情都已经处理好了。

    最坏情况:

    • K&R样式原型
    • 宏正在隐藏定义
    • 隐式声明(根据你的答案)
        3
  •  1
  •   Jonathan Leffler    16 年前

    你考虑过使用吗 cscope (可从 SourceForge )?

    我在一些相当重要的代码集上使用它(25000多个文件,一个文件中大约有20000行),取得了很好的成功。在一个古老的太阳E450上建立交叉引用需要一段时间(5-10分钟)和更长的时间(20-30分钟),但我发现结果很有用。


    在几乎同样古老的Mac(双1Ghz PPC 32位处理器)上,运行在OpenAFS(1.5.59)源代码上的CScope提供了很多声明函数的地方,有时在代码中,有时在头中。扫描4949个文件花费了几分钟时间,生成了一个58 MB的cscope.out文件。

    • openafs-1.5.59/src/sys/sys_原型.h
    • openafs-1.5.59/src/aklog/aklog_main.c(以及注释“为什么AFS不提供这些原型?”)
    • openafs-1.5.59/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个实例中的其余部分似乎是函数、文档引用、发行说明、更改日志等的使用。

        4
  •  0
  •   Edward Z. Yang    16 年前

    当前的工作原理,我们已经决定,在戳了预处理器之后,也没有找到任何东西,是OpenAFS让编译器推断函数的原型,因为它返回一个整数,并以指针、整数、指针、整数作为参数。我只需要自己定义就可以解决这个问题。

    编辑 太棒了!我找到了吸烟枪:

    AFS.xs:2796: error: implicit declaration of function ‘pioctl’
    
        5
  •  0
  •   adeason Ben Poliakoff    11 年前

    在回答了最初的一般性问题之后,如果有人来到这个页面,想知道在哪里可以找到定义pioctl的头文件:

    在OpenAFS(1.6.7)的当前版本中,在sys_prototype.h中定义了一个pioctl的原型,但在最初提出这个问题的时候,该文件不存在,并且在OpenAFS代码树之外没有可以看到pioctl的原型。

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

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

        6
  •  -1
  •   Jeremy Huiskamp    16 年前

    它不是通常在手册的摘要里说的吗?