库的头文件只包含函数的声明。那么,当我们调用库函数时,函数是如何运行的呢?
例如:在 C 语言中,int strcmp ( const char * str1, const char * str2 );
是 strcmp 函数的声明。
当我们在程序中调用 strcmp 函数时,如果函数体不在头文件中,那么 strcmp 函数是如何执行的呢?
库的头文件只包含函数的声明。那么,当我们调用库函数时,函数是如何运行的呢?
例如:在 C 语言中,int strcmp ( const char * str1, const char * str2 );
是 strcmp 函数的声明。
当我们在程序中调用 strcmp 函数时,如果函数体不在头文件中,那么 strcmp 函数是如何执行的呢?
至于实现的位置,在构建时会添加运行时库到您的程序中,因此作为一个编码人员,您可以调用所有这些函数,因为您有它们的函数定义的“前向”声明,但是直到运行时才加载实现。
这样做的原因是因为在每个使用它的程序中复制printf等东西的实现代码是很愚蠢的。这将浪费大量内存!因此,只有声明暴露给您,程序员,操作系统在运行时在内存中共享函数的实现。
printf
的代码已经被编译并存储在某个地方。当链接器将您的目标代码与标准库链接时,将构建最终可执行文件。gcc -c somefile.c
命令并查看结果。gcc -v
选项并了解其输出内容。ld
命令的作用,您就能得到答案。stdio.h
的程序定义了printf
,会怎样呢?
program.c:#include <stdio.h> //suppose this contains definition of printf
int main()
{
/*Call printf() somewhere or maybe not */
}
gcc program.c -o output
这里所有在 stdio.h
中定义的内容都将在 program.c
文件中被替换,使得你的可执行文件 output
变得非常巨大。相反,更好的做法是在需要时从一个地方调用经常使用的函数,比如 stdio.h
中的 printf
。
strcmp
是运行库中的函数,在构建可执行文件时会被添加到程序中。这个过程在不同操作系统上的细节有所不同。
strcmp
的string.h
),则编译器会进行隐式声明。如果在运行时找不到函数定义(即根据您的假设在库中缺少),则链接器将在默认情况下与标准C库进行链接时发出警告(例如,在使用gcc时进行-lc
)。请注意保留HTML标记。strcmp
而其定义显然没有出现的问题。虽然它(终于)提到了C库,但它并没有解释链接对象模块。 - Eric Postpischil它存在于编译好的库中。当您在链接到某个库时编译项目时,预编译的库将添加到最终编译中。