内容: 实习的时候导师曾经问到过你知道为啥你的printf可以直接使用吗?你不需要将它的实现c文件一起链接也可以使用,甚至你不包含stdio.h文件也可以使用,引起了我对以前学习的动态库知识的回忆!
演示c文件:不包含stdio.h (包含的就不用演示啦,都是这么写的哈哈)
int main()
{
printf("hello !");
return 0;
}
结果: 可以看到也是可以执行成功的,但是提示的错误原因是没有看到函数声明,但是是警告,不是错误。
思考: 那么为什么你可以直接去使用一个你没有声明也没有定义的函数呢?
回答: 因为这个函数在我们lib动态库中,动态库中有这个内容,而且系统动态库已经被载入内存了
验证: ldd a.out
可以看到我们a.out依赖了三个库,所以其实printf的实现是在库里,我们运行的时候再加载的,这三个库是libc库,里面有常见库函数的实现。
使用nm指令验证是否在库里: nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep printf
可以看到有很多个printf的实现,类似c++的重载,库中的printf也有很多的种类
大四学生一枚,文章均非抄袭或者模仿,均为原创,仅代表个人观点,如果文章有错误的地方,欢迎在下方提出,每条评论我都会去认真看并回复,同时感谢指正的前辈。