我暂时没有触及c ++,这个问题可能是愚蠢的,但它确实困扰了我一段时间.
假设我有以下c程序:
#include <stdio.h>
int main()
{
int i;
for(i=0; i<10; i++)
{
printf("Hello World!\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我知道我包括的原因stdio.h是因为我打电话printf的main,但我想知道编译器怎么会知道在哪里可以找到执行printf()编译过程中?stdio.h只提供函数原型但在编译期间究竟发生了什么?
编译器会知道搜索实现的某些前缀路径printf吗?如果是这样,如何找到它们?
非常感谢!
小智 7
如果您使用的是Linux系统,那么可能就是使用的C库glibc.GCC实际上并不提供C库实现,只提供头文件.实际实现这些函数的定义是C库的工作.在Linux上,有一种称为"共享库"的东西,它们由需要它的程序动态加载.例如:
ldd /usr/bin/gcc
linux-vdso.so.1 (0x00007ffd9e9f8000)
libm.so.6 => /lib64/libm.so.6 (0x00007ff9a35a6000)
libc.so.6 => /lib64/libc.so.6 (0x00007ff9a31de000)
/lib64/ld-linux-x86-64.so.2 (0x000055953c573000)
Run Code Online (Sandbox Code Playgroud)
您可以libc通过-nostdlib在自己的C库中传递和链接来禁用链接.还有其他方法可以替换C库提供的定义,例如您自己的链接malloc等.链接器只允许为任何给定的声明找到一个定义,因为在C中没有名称重整,所以很容易这样做.
这是一个过于简化的解释,并没有提到内置函数,数学库等.
| 归档时间: |
|
| 查看次数: |
780 次 |
| 最近记录: |