简单理解:
- .h文件是不会被编译器编译的,而每个.cpp文件都会被编译,生成一个.obj文件。
- 这两个文件名称不一定非要一样(只要.cpp包含.h即可),只是为了方便阅读而已。在编译时,会根据#include去查相应的.h文件。
具体:
C++允许多次声明,但只允许一次实现。比如int foo();就是一次声明,而 int foo() {} 就是一次实现。 如果编译时有多个.cpp文件中 #include 了同一个含有函数实现 .h, 这时候链接器就会在多个目标文件中找到这个函数的实现,而这在C++ 中是不允许的,此时就会导致 Link错误: 找到一个或多个重定义的符号。 因此为了让函数可以在各个.cpp 中共享,正确的做法就是在.h中只声明函数,并在另一个.cpp文件中实现这个函数。这样就不会冲突了。
作者:耶伦奶奶 链接:https://www.zhihu.com/question/58547318/answer/157444718 来源:知乎
另一种说法
在我看来,cpp并不需要严格地遵从在头文件中声明,源文件中定义这一最标准的准则!完全可以在头文件中进行申明和定义(不仅仅是模版类,内联函数,另外数据结构,类中类等等它们的声明和定义都可以在头文件中进行;另外,也可以完全在源文件中进行申明定义,然后别的模块去include这个源文件!唯一需要保证的是,在一个工程的link阶段,函数或者变量只有一次定义另外写cpp的时候,头文件也不必要用.h来作为后缀,源文件也不必非要用cpp为后缀!cpp和h文件的分离最大的目的,在我看来是为了便于组织管理,以及方便二次开发时的调用!
作者:「已注销」 链接:https://www.zhihu.com/question/58547318/answer/161280273 来源:知乎
反证
那我反过来说吧,不在头文件中声明或不在源文件中定义。 1、不在头文件中声明,使用函数需要自己声明,否则编译错误找不到声明。 2、不在头文件中声明且在源文件中声明,同1。 3、不在源文件中定义,链接错误提示找不到符号。 4、不在源文件中定义且在头文件定义,非static的情况下,多处include出现链接错误提示重复定义符号。static的情况下,多次重复定义导致最终执行文件变大。 根源在于include等同于文件内容归并,链接查找符号。
作者:暗黑谢广坤 链接:https://www.zhihu.com/question/58547318/answer/157482607 来源:知乎
|