>>> 搬运一个知乎问答

===================下面是回答===================

答1、

然后问题来了:假如你这个函数到处都要用到,你总不能每个cpp里贴上这么一行吧。

答案自然就是把它放在头文件里咯。这就是你书里那句话的意思。

答2、

要从几个部分解释一下。

第一,预编译指令#include的作用是将所包含的文件全文复制到#include的位置,相当于是个展开为一个文件的宏。

第二,C++允许多次声明,但只允许一次实现。比如int foo();就是一次声明,而int foo(){}就是一次实现。

如果编译时有多个.cpp文件中#include了同一个含有函数实现的.h,这时候链接器就会在多个目标文件中找到这个函数的实现,而这在C++中是不允许的,此时就会引爆LNK1169错误:找到一个或多个重定义的符号。

因此为了让函数可以在各个.cpp中共享,正确的做法就是在.h中只声明函数,并在另【 一个(重点)】.cpp中实现这个函数。这样就不会冲突了。

作者:耶伦奶奶
链接:https://www.zhihu.com/question/58547318/answer/157444718
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

答3、

碰巧最近也在研究这个问题,来说说自己的一点见解(纯属个人体会)

1.便于查找使用。在一个项目中,会涉及到许多函数,定义与声明分开可以更快的找到所需要的函数(别说看文档,效率太低),同时定义可能需要成千上万行代码,而声明只需要几十行,这意味着等待代码载入的时间大大缩短了。(这一点感触最深刻,10MB+的源代码,在手机上载入直接未响应,自此我彻底认同这种做法了。)

2.为闭源提供方便。只提供接口,不提供函数具体定义。

3.便于团队合作,每个人只用关心自己负责的部分即可,写完后提供接口,别人直接用就好了。

4.同一个声明,可以换上不同的定义(编译时选择不同的文件),便于快速比较算法性能等神奇的用法。

同时如果关键参数也在放在小巧的头文件中,意味着改参数再也不用等上个数分钟加载庞大的源文件,不用从数千个函数中寻找数百个参数中的某几个参数。

以上都是我最近几天体会出来的,不保证一定对,如果有误,请多多指教,感激不尽。

作者:知乎用户
链接:https://www.zhihu.com/question/58547318/answer/157458441
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

为什么c++要“在头文件中声明,在源文件中定义”?相关推荐

  1. java定义异常的头文件_c++ 声明定义都在头文件中怎么include?

    瀉藥, @李毅 老大已經點名你出錯的地方了, @felix 老大也指出是ODR的問題, 看來窩除了能在上面說下原理沒什麼做了, 哈哈. 不過既然兩位老大都沒有將原理和你的庫結合, 那麼這個微小工作就由 ...

  2. c语言中的stdbool.h头文件,【C语言】中的stdbool.h头文件

    C语言中的stdbool.h头文件 一.相关基础知识 二.具体内容 Win7下安装的VS2015中的stdbool.h的位置为: F:\Program Files (x86)\Microsoft Vi ...

  3. 头文件里面声明的函数,到底加extern好还是不加extern呢?加不加都一样,默认是EXTERN。有时候没包含头文件编译也能找到函数,不报错只警告

    头文件里面声明的函数,到底加extern好还是不加extern呢? C/C++>C语言 收藏回复 [问题点数:20分] 0深水蓝0 等级 结帖率 79.49% 想征求一下大家的意见. 一些希望对 ...

  4. C++头文件(xxx.h)与源文件(xxx.cpp)的关系

    头文件是不能被编译的: "#include"为编译预处理指令,其作用:源文件(xxx.cpp)中的#include "xxx.h"指令将xxx.h 中的代码在编 ...

  5. c语言ofstream头文件,【c++】c++中的ofstream和ifstream

    原文出自[比特网],转载请保留原文链接:http://soft.chinabyte.com/database/460/11433960.sh [导读] ofstream是从内存到硬盘,ifstream ...

  6. C语言两个同名头文件,C lang: C语言中两个头文件引入相同的头文件(Header.h)

    C lang: C语言中两个头文件引入相同的头文件(Header.h) C lang: C语言中两个头文件引入相同的头文件(Header.h) [var1] For example: Header.h ...

  7. 头文件如何来关联源文件?

    这个问题实际上是说,已知头文件"a.h"声明了一系列函数,"b.cpp"中实现了这些函数,那么如果我想在"c.cpp"中使用"a. ...

  8. c语言中被调用函数只需在主调函数中声明,其他函数中不用声明,求助,函数在其他函数中使用时要先声明后调用,这个没声明就用了...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 如题,程序如下: #include #include //malloc,calloc,free,realloc头文件 #define LEN sizeof ...

  9. 【C 语言】结构体 ( 结构体类型定义 | 结构体类型别名 | 声明结构体变量的三种方法 | 栈内存中声明结构体变量 | 定义隐式结构体时声明变量 | 定义普通结构体时声明变量 )

    文章目录 一.结构体类型定义 二.结构体类型别名 三.结构体类型变量声明 1.使用结构体类型 ( 别名 ) 声明变量 2. 定义隐式结构体时声明变量 3.定义普通结构体时声明变量 二.完整代码示例 一 ...

  10. 51单片机c语言头文件大全,51单片机keilC中头文件absacc.h作用

    当51单片机通过8255和锁存器74LS273来扩展IO时,经常用到头文件absacc.h. 在程序中,用"#include"即可使用其中定义的宏来访问绝对地址,包括:CBYTE. ...

最新文章

  1. php extension loaded,php中extension_loaded()函数的使用详解
  2. add函数 pytorch_Pytorch学习记录-Pytorch可视化使用tensorboardX
  3. 国内做事就要高调——财富人生:邹果庆:中国新蛋网总裁
  4. css技巧之如何实现ul li边框重合
  5. python float和int的区别_Python四种数值类型(int,long,float,complex)区别及转换
  6. 随机森林与梯度提升树
  7. Windows勾子处理类Thook 以及示例
  8. bufferedreader接收不到数据_PS4、Xbox手柄和Switch跨次元组队?全靠八位堂USB无线接收器...
  9. Node.js构建可扩展的Web应用1
  10. HotSpot增量Java垃圾收集器
  11. 为什么游戏开发者不玩游戏_什么是游戏开发?
  12. js工作笔记002---检测当前是不是触摸设备(移动设备)
  13. 动态规划练习合集(c++)
  14. 教之初在线计算机考题,教之初计算机考试系统
  15. SQLPrompt关闭联网
  16. 基于Python的串口调试工具
  17. java 取系统当前时间_java获取当前系统时间方法
  18. DOM及DOM二级事件
  19. Unity 动画压缩及其优化
  20. python运动目标绘制轨迹_实时轨迹绘制Matplotlib

热门文章

  1. 七步从AngularJS菜鸟到专家(6):服务
  2. 【技术培训】招收Jeecg门徒 ---javaweb初级入门班
  3. 为什么谷歌要执行严格的代码编写规范
  4. JSF请求处理过程(二)请求处理过程总览(FacesServlet#service)
  5. Python学习day02_数字类型 与 布尔类型 短路逻辑和运算符优先级
  6. Redis-字典(hash)基础
  7. filebeat + es 日志分析
  8. 雷林鹏分享:PHP 数组排序
  9. 2019.5.18-5.19 ACM-ICPC 全国邀请赛(西安)赛后总结
  10. sendBroadcast和sendStickyBroadcast的区别