想请问一个关于头文件中函数申明与编译时是怎样寻找函数定义的有关问题

想请教一个关于头文件中函数申明与编译时是怎样寻找函数定义的问题?
例如:printf函数是申明在《stdio.h》文件中的,但是我们在编写程序时,却只是包含了头文件《stdio.h》,里面没有它的定义,但是却可以正常的输出,这是为什么呢?是关于编译器的问题么??程序是如何知道printf函数是在哪里定义的呢?一个文件一个文件的挨着查找么?还是直接查找包含头文件《stdio.h》的c文件呢?

它的定义是包含在类似如下一个文件中的:
文件名:printf.c

#include "stdio.h"
int printf (const char *, ...)
{....}


------解决方案--------------------
编译的时候, .cpp以及 这个.cpp里 包含的所有.h里的代码,都会被扩展到.cpp文件里,然后被变异成一个.obj文件。(PE格式,并不一定能执行)  ....然后再链接....
------解决方案--------------------
这是链接器的事情
将所有的obj lib 一起进行链接操作。
------解决方案--------------------
只需声明原型就可以了,寻找真正的函数实现(就是找到符号地址)是链接器的工作。

其实,楼主的想法是有些道理的,楼主觉得总要告诉编链接器printf函数实现的coff的位置吧?

没错,但这些编译器都会将printf的定义所在的lib库设定为默认链接,你不管它,它就默默给你加上去了。

如果你使用一些非默认的lib,就需要你手工告诉连接器了,比如,当你使用输入法的相关API,就要加入Imm32.lib,这需要你人工在linker选项里加入。

同理,你自己做的lib,也要你手工引入。

你也可以在代码里插入linker注释,

(不同编译器写法不尽相同)
#pragma comment(lib, "abc.lib")

这样其实是在预处理阶段做了一个记录,让最后的链接阶段做这个操作而已。

但我不建议你使用这种预处理注释,还是老老实实地在工程属性的linker选项里加入需要链接的lib。


 

------解决方案--------------------
还有一个链接中间文件的过程的!(库文件)
------解决方案--------------------
绝大部分编译器默认都会直接链接libc(C标准库),printf也包含在其中。

引用:
例如:printf函数是申明在《stdio.h》文件中的,但是我们在编写程序时,却只是包含了头文件《stdio.h》,里面没有它的定义,但是却可以正常的输出,这是为什么呢?是关于编译器的问题么??程序是如何知道printf函数是在哪里定义的呢?一个文件一个文件的挨着查找么?还是直接查找包含头文件《stdio.h》的c文件呢?

它的定义是包含在类似如下一个文件中的:
文件名:printf.c

#include "stdio.h"
int printf (const char *, ...)
{....}

------解决方案--------------------
《程序员的自我修养——链接、装载与库》