头文件中外部函数的定义在哪里

时间:2013-12-12 19:39:25

标签: c linker extern

如果您阅读标准头文件,您可能会观察到一些外部函数声明。但我无法在该头文件的标题中找到完整的函数体。任何人都能告诉我上述功能的完整定义在哪里。这是一个例子: 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));

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

2 个答案:

答案 0 :(得分:4)

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

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

您的Linux发行版可能有帮助的工具。 Ubuntu和Debian上的apt-get source命令和基于RPM的发行版上的yumdownloader --source命令可以找到与大多数系统包相关联的源。

答案 1 :(得分:0)

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

永远不要想到在头文件中定义一个函数(或变量)。如果您意外地包含两次头文件,则会成功获得重新定义错误。因此,只有声明存在于其中。

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