为何只包含头文件就可以使用头文件中声明的函数

为什么只包含头文件就可以使用头文件中声明的函数?
为什么只包含头文件就可以使用头文件中声明的函数,而不需要包含定义该函数的源文件呢?

------解决方案--------------------
标准库可以这样做,非标准的需要链接源文件。
------解决方案--------------------
首先一点,文件包含只是一个合并不同文件代码的手段,cpp怎么不能包含呢?当然可以了。但这有两个问题:

1 这不是一种惯用法,不符合主流意识
2 这可能产生符号的重复定义

说道第2点,我们分析一下,C++程序在构建的时候,有两个主要的时期

compile-time
linkage-time

在compile-time,编译是以编译单元进行的——每一个cpp源文件就是一个编译单元,compiler会逐cpp进行编译,每一个cpp中的h头文件都包含进这个单元进行编译,一个编译单元只要保证所有要用到的符号都可以查找到就可以了。这产生一个obj目标文件,该cpp中所有定义的符号都在里面。

在linkage-time所有被编译好的obj文件被linker进行符号链接以产生最终文件,但符号定义必须保证

1 存在
2 唯一

否则,会linker就会抱怨。

问题来了,如果在compile-time,一个cpp文件A被包含进cpp B进行编译。那你是否还要对这个被包含近来的cpp进行编译?

如果是,那么如果A中存在符号定义,则会和上面第二条矛盾。
如果否,那么你对cpp的处理就产生了不一致性,cpp和h文件的区别界限模糊。

你说应该包含cpp么?
------解决方案--------------------
这个应该是预处理器决定的吧,你可以百度查下预处理器,预处理器在源代码上将包含的头文件执行一些文本操作。
------解决方案--------------------
编译时需要,函数声明,不然无法进行语法检查。

链接时链接器找到对应的函数实现,才能链接成功。