【问题标题】:where is the definition of external functions in a header file [closed]头文件中外部函数的定义在哪里[关闭]
【发布时间】:2013-12-12 19:39:24
【问题描述】:

如果您阅读标准头文件,您可能会观察到一些外部函数声明。但我在该头文件的头文件中找不到完整的函数体。谁能告诉我提到的函数的完整定义在哪里。这是一个例子: pthread.h头文件

extern int pthread_create (pthread_t *__restrict __newthread,
               __const pthread_attr_t *__restrict __attr,
               void *(*__start_routine) (void *),
               void *__restrict __arg) __THROWNL __nonnull ((1, 3));

如果通过定义这个函数将与库对象文件链接,那么无论如何要找到函数体吗?

【问题讨论】:

  • 定义将在 pthreads 库中

标签: c linker extern


【解决方案1】:

您可能无法使用它。人们不需要提供带有 C 标头的源代码。例如,在 Windows 上,将函数定义构建到 DLL 中而不向您提供源代码是很常见的。例如,Microsoft 认为大多数 Windows 内部人员的源代码是机密的。

在 Linux 上,源代码通常可用,但没有简单的方法将给定的标头映射到其源代码。

您的 linux 发行版可能有一些有用的工具。 Ubuntu 和 Debian 上的 apt-get source 命令以及基于 RPM 的发行版上的 yumdownloader --source 命令可以找到与大多数系统软件包相关的源代码。

【讨论】:

  • 没错,但由于库对象是二进制执行程序,我想知道程序函数调用如何连接到函数体,我的意思是链接器程序如何将函数原型链接到它的对象体。它是根据函数名搜索一些特殊的模式还是什么?谢谢。
  • @muradin:当然可以。您在 C 程序中使用的任何外部函数都只能通过其名称来识别——这就是您提供给链接器的全部内容! (而且您可能已经知道不能使用相同的名称两次。)有关 a 库格式的示例,请参见 f.e. microsoft.com/msj/0498/hood0498.aspx
【解决方案2】:

首先,了解你为什么#include-ing 一个头文件。主要原因是要在实际定义发生之前声明函数原型。这就是为什么头文件包含在文件的最开头,以便函数声明出现在从 .c 文件中的函数(可能)调用它们之前。

永远不要考虑在头文件中定义函数(或变量)。如果您不小心包含了两次头文件,您将成功获得重新定义错误。因此,它们中只存在声明。

适当函数的定义最有可能出现在您要与源链接以创建最终二进制文件的库(共享或静态)中。搜索相应的库代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2011-06-17
    • 2018-10-05
    相关资源
    最近更新 更多