.h与.hpp文件的区别
c++中的.hpp文件
hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再 将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库。
1、是Header Plus Plus 的简写。
2、与*.h类似,hpp是C++程序头文件 。
3、是VC专用的头文件,已预编译。
4、是一般模板类的头文件。
5、一般来说,*.h里面只有声明,没有实现,而*.hpp里声明实现都有,后者可以减 少.cpp的数量。
6、*.h里面可以有using namespace std,而*.hpp里则无。
7、*.hpp要注意的问题有:
a)不可包含全局对象和全局函数
由于hpp本质上是作为.h被调用者include,所以当hpp文件中存在全局对象或者全局函数,而该hpp被多个调用者include时,将在链接时导致符号重定义错误。要避免这种情况,需要去除全局对象,将全局函数封装为类的静态方法。
b)类之间不可循环调用
在.h和.cpp的场景中,当两个类或者多个类之间有循环调用关系时,只要预先在头文件做被调用类的声明即可,如下:
|
在hpp场景中,由于定义与实现都已经存在于一个文件,调用者必需明确知道被调用者的所有定义,而不能等到cpp中去编译。因此hpp中必须整理类之间调用关系,不可产生循环调用。同理,对于当两个类A和B分别定义在各自的hpp文件中,形如以下的循环调用也将导致编译错误:
|
c)不可使用静态成员
静态成员的使用限制在于如果类含有静态成员,则在hpp中必需加入静态成员初始化代码,当该hpp被多个文档include时,将产生符号重定义错误。唯 一的例外是const static整型成员,因为在vs2003中,该类型允许在定义时初始化,如:
|
由于静态成员的使用是很常见的场景,无法强制清除,因此可以考虑以下几种方式(以下示例均为同一类中方法)
一、类中仅有一个静态成员时,且仅有一个调用者时,可以通过局域静态变量模拟
|
二、.类中有多个方法需要调用静态成员,而且可能存在多个静态成员时,可以将每个静态成员封装一个模拟方法,供其他方法调用。
|
三、第二种方法对于大部分情况是通用的,但是当所需的静态成员过多时,编写封装方法的工作量将非常巨大,在此种情况下,建议使用Singleton模式,将被调用类定义成普通类,然后使用Singleton将其变为全局唯一的对象进行调用。
如原h+cpp下的定义如下:
|
采用singleton方式,实现代码可能如下(singleton实现请自行查阅相关文档)
|
.h与.hpp文件的区别相关推荐
- .h 与.hpp文件的区别
hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译.而实现代码将直接 ...
- .h 与 .hpp 文件
hpp,顾名思义等于.h加上.cpp,在boost.Xerces等开源库中频繁出现,偶在机缘巧合之下,学得一招半式,遂记录如下,以供参考学习. hpp,其实质就是将.cpp的实现代码混入.h头 ...
- .h和.c文件的区别到底是什么(精确讲解)
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先 编译成 ...
- string/string.h/cstring头文件的区别摘要
1. #include <cstring> //不可以定义string s:可以用到strcpy等函数 using namespace std; #include <st ...
- 转.h和.cpp文件的区别
关于头文件和源文件的分别 首先,我们可以将所有东西都放在一个.cpp文件内. 然后编译器就将这个.cpp编译成.obj,obj是什么东西? 就是编译单元了.一个程序,可以由一个编译单元组成, 也可以有 ...
- hpp文件和h文件有什么区别
hpp文件和h文件都是C++中的头文件,它们的作用是用来声明函数.类和变量的.但是它们有一个主要的区别,就是hpp文件中可以包含C++代码,而h文件中不能包含C++代码.通常来说,我们可以将hpp文件 ...
- .hpp文件和.h文件的区别
hpp,顾名思义等于.h加上.cpp,在boost. Xerces等开源库中频繁出现,偶在机缘巧合之下,学得一招半式,遂记录如下,以供参考学习. hpp,其实质就是将.cpp的实现代码混入.h ...
- hpp头文件与h头文件的区别
hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译.而实现代码将直接 ...
- c++中 .hpp和.h文件的区别
.hpp文件 本质:将.cpp的实现代码混入.h头文件当中,使定义与实现都在同一文件.对该类的调用只需要include该.hpp文件,不需要将cpp加入编译.实现代表直接编译到调用者的.obj文件中, ...
最新文章
- Android,UI主线程与子线程
- ITK:设置默认的线程数
- 04-老马jQuery教程-DOM节点操作及位置和大小
- 禅道之需求追踪和多角色协作流程
- 监测利器cacti服务安装
- mbed试玩—高速开发MCU应用(基于FRDM-KL25Z)
- 高项近5套选择题知识点思维导图
- U3D游戏包il2cpp逆向解包,apk加密资源解密
- Kali渗透测试:社会工程学工具
- 简述计算机配件选购的一般原则和流程,计算机维护与维修教学全套课件(刘云霞)(已检查完11 18)教学单元五选购与配置计算机.doc...
- android fps 检测工具,Android FPS监测 方法总结
- 关于海康门禁的开发体会一
- Hard Link 与 Symbolic Link
- 《思考的技术》--大前研一读书笔记
- 史上z..zui难回答的26个问题(1)
- 常用文本编辑器(NotePad++,UtraEdit)
- kaggle TMDB Box Office Prediction
- android使用google gcm接收push消息需要注意的地方
- C#程序设计实践课程设计之数字华容道
- 《西游记》八十一难的顺序
热门文章
- 昂达平板装linux系统下载,昂达N61G FOR Linux驱动安装
- IDL下高分二号完整预处理代码
- python实现字母的加密和解密 字典_利用Python产生加密表和解密表的实现方法
- 【MCP3208/MCP3204】STM32多通道AD采集,有源码
- 手游SDK到底是什么?
- css3怎样设置div边框圆角 怎样把div变成圆形
- 图像编码与 H264 基础知识
- python转js解释器_python 代码转换 js
- 可视化的工业互联网 3D 展示
- matlab编程excosxdx求积分,求定积分∫e^2xcosxdx.