首页 > 编程语言 >c++ .h头文件和.cpp源文件关系(转)

c++ .h头文件和.cpp源文件关系(转)

时间:2023-10-30 11:55:58浏览次数:61  
标签:文件 头文件 包含 源文件 cpp include

https://www.cnblogs.com/fengzhengfly/p/8884581.html

https://blog.csdn.net/qq_35452533/article/details/77282326

头文件是声明,源文件是定义

在cpp里包含.h,就会包含该h文件的cpp定义,所以需要在cpp里使用别的.h文件中的函数只能包含该.h,或者已包含的.h中

已经包含的改.h,也就是间接包含(尽量避免)

 

现有两个文件Test.h 和Test.cpp
 #include <iostream>在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 语句
这样不仅输入量减少,
而且代码也美观多了
代码也主次分明了
毕竟,.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文件)

标签:文件,头文件,包含,源文件,cpp,include
From: https://www.cnblogs.com/Cxiangyang/p/17797451.html

相关文章

  • MITK编译错误C2220 mitkLabelSetImageToSurfaceFilter.cpp
    错误 C2220 以下警告被视为错误(编译源文件E:\0_MITK\MITK\Modules\Multilabel\mitkLabelSetImageToSurfaceFilter.cpp)[E:\0_MITK\MITK\SuperBuild\MITK-build\Modules\Multilabel\MitkMultilabel.vcxproj] MITK-build E:\0_MITK\MITK\SuperBuild\ep\include\ITK-5.2\i......
  • OpenCV4.1.0中的GPU版本的SURF特征点提取类的命名空间、所在头文件和类名
    OpenCV4.1.0中的GPU版本的SURF特征点提取类的命名空间、所在头文件和类名情况如下:类名:cv::cuda::SURF_CUDA所在的命名空间:cv::cuda所在头文件:$\build\install\include\opencv2\xfeatures2d。其中,$是编译OpenCV4.1.0的基础模块和扩展模块时,OpenCV4.1.0源代码所在的位置。 翻......
  • cpp以毫秒级精度获取当前时刻的时间戳
    首先获得当前时刻的时间点std::chrono::time_point<std::chrono::system_clock,std::chrono::milliseconds>   tp=std::chrono::time_point_cast<std::chrono::milliseconds>(     std::chrono::system_clock::now());再将时间点转换为时间戳形式inttim......
  • pgsql create table,cpp fill psql table via the third party library pqxx
    //createtablet1;createtablet1(idbigserialnotnullprimarykey,authorvarchar(40)notnull,commentvarchar(40)notnull,contentvarchar(40)notnull,headervarchar(40)notnull,isbnvarchar(40)notnull,objectvarchar(40)notnull,summaryvarchar(40......
  • 头文件和类的声明
    1.CvsC++关于数据和函数CDataFunctions对于C来说,数据大部分情况是所有函数都可以访问的,这样对程序来说会变得很混乱C++DataMembersMemberFunctions对于C++来说,数据和函数封装在一起形成类,可以设定为数据只能让类里的函数访问,具有良好的组织性2.C++关于数......
  • cpp: vs 2022 文件头注释插件
    下载插件安装DoxygenCommentshttps://marketplace.visualstudio.com/items?itemName=FinnGegenmantel.doxygenComments 在工具--选项 进行设置 ......
  • [侯捷_C++面向对象高级开发_上] 2 头文件和类的声明
    1.CvsC++关于数据和函数CDataFunctions对于C来说,数据大部分情况是所有函数都可以访问的,这样对程序来说会变得很混乱C++DataMembersMemberFunctions对于C++来说,数据和函数封装在一起形成类,可以设定为数据只能让类里的函数访问,具有良好的组织性2.C++关于数......
  • qt软件崩溃的分析方法-定位源文件和行号
    软件(debug版exe或者release版exe)在正常运行状态下(不是gdb调试运行),如果软件崩掉,那么会直接闪退,软件什么也做不了,此时无法保存软件中的状态信息,此外,也无法提供任何软件崩溃原因的信息。因此,软件崩掉,我们需要能给出信息才行,指导我们修改源码。解决方法如下(针对Windows):注:如果用vs开发qt......
  • 1、构建目录必须和源文件为同级目录
    复制工程后路径发生变化,重新构建运行时会出现“QT构建目录必须和源目录为同级目录”提示,解决办法如下:方法一:点击project(项目)->然后,看看Buitdirectory(构建目录),看看这里是不是文字变成了红色,如果是红色的路径,说明路径是错误的,改一个你自己的路径即可(但要和工程目录平级)。注......
  • 【Cpp 语言基础】vector<int>::size_type死循环问题
    今天写了一个将数组倒序打印出来的程序,用到了vector<int>::size_type类型但是出现了错误。错误的原因:size_type是unsignedint类型不会减为负值。在for()循环index--下,由于size_type永不为负,index>=0永远成立。 解决办法:索引改为int类型。voidfunction(constvector<i......