C++ 在.h文件中包含头文件和在.cpp文件中包含头文件有什么区别?

(遇到一个问题,看学习视频的时候,总共有两个头文件以及两个cpp。
例 T1.h,T2.h,以及T1.cpp, main.cpp)
T2.h中包含T1.h,T2.cpp包含T2.h, main中只引用了T1.h,但T1.h没有调用T2.h,运行时发现T2.h中声明的函数没有被main调用。但是视频中可以,暂时没有解决。。。

现有两个文件Test.h 和Test.cpp
#include 在Test.h中包含 和在Test.cpp中包含有什么区别?

1、在cpp文件中包含.h文件,要么你要用到这个头文件中的函数或者类,要么就是实现这个头文件;

2、.h —就是为了放一堆声明所产生的东西
如果是定义放在.h中。 如果.h被重复包含多次,那么则会被报重定义。所以在.h 中都要—如果函数就要是inline ,如果是变量就要 selectany (windows)才不会被报错。

3、#include尽量写到cpp文件里。两个文件在.h文件里相互include,就会产生编译错误,而两个文件在.c文件互相include,就不会有该问题,因此在.h文件include就要避免互相包含的问题,而.cpp文件就不需要考虑

4、
1)在 .h 里面 include 的好处是:
	如果很多.c, .cpp文件,都包含一批头文件,
	如果复制很容易遗漏
	如果输入,很容易出错
	如果全部在一个.h, include  那么每个.c,.cpp文件只需要一个#include 语句
	(我认为在h文件中声明函数方法,方便在各种cpp文件中调用。
					若在cpp中声明是无法在另一个cpp中进行使用的)
	这样不仅输入量减少,
	而且代码也美观多了代码也主次分明了
	毕竟,.c, .cpp, 里面要实现的函数,才是主要代码
		
2)主要缺陷:
	可能会包含完全不需要的头文件,
	增加编译工作量(有的时候我自己也记不住声明了什么)

5、如果你在a.h头文件中include了“stdio.h”,“iostream”等
那么你的a.cpp源文件只要include你的a.h,就相当于include了“stdio.h”,“iostream”等
但是当其他文件include你的a.h的同时也就包含了“stdio.h”,“iostream”,等
这个要看你个人需要,如果你需要让其他文件也include,那么写在a.h中就可以,其他文件包含a.cpp简单整洁无脑
如果只有a.cpp需要include,那么还是建议在a.cpp中include

6、如果a.c包含了头文件a.h,a.h包含了头文件b.h,b.c也包含了b.h,那么当b.h发生改变时,a.c和b.c都会重新编译
也就是所有包含了b.h的都会重新编译,无论是直接包含,还是间接包含

7、2点原则:
第一个原则:如果可以不包含头文件,那就不要包含了,这时候前置声明可以解决问题。如果使用的仅仅是一个类的指针,没有使用这个类的具体对象(非指针),也没有访问到类的具体成员,那么前置声明就可以了。因为指针这一数据类型的大小是特定的,编译器可以获知(C++编译器自上而下编译源文件的时候,对每一个数据的定义,总是需要知道定义的数据的类型的大小)

第二个原则:尽量在CPP文件中包含头文件,而非在头文件中。假设类A的一个成员是是一个指向类B的指针,在类A的头文件中使用了类 B的前置声明并编译成功,那么在A的实现中我们需要访问B的具体成员,因此需要包含头文件,那么我们应该在类A的实现部分(CPP文件)包含类B的头文件而非声明部分(H文件)(转载者表示功力太浅meikandong,B的头文件不是H文件吗?)

感谢原作者的分享!

原文地址:https://blog.csdn.net/xueruifan/article/details/50569639

  • 4
    点赞
  • 10
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值