添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

h、cpp和hpp头文件之间使用区别

hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库。

hpp的优点不少,但是编写中有以下几点要注意:

1、是Header Plus Plus 的简写。

2、与*.h类似,hpp是C++程序头文件 。

3、是VCL专用的头文件,已预编译。

4、是一般模板类的头文件。

5、一般来说, .h里面只有声明,没有实现,而 .hpp里声明实现都有,后者可以减少.cpp的数量。

6、 .h里面可以有 using namespace std ,而 .hpp里则无。

7、不可包含全局对象和全局函数。

由于hpp本质上是作为.h被调用者include,所以当hpp文件中存在全局对象或者全局函数,而该hpp被多个调用者include时,将在链接时导致符号重定义错误。要避免这种情况,需要去除全局对象,将全局函数封装为类的静态方法。

8、类之间不可循环调用。

在.h和.cpp的场景中,当两个类或者多个类之间有循环调用关系时,只要预先在头文件做被调用类的声明即可,如下:

class B;
class A{
public:
   void someMethod(B b);
class B{
public :
	void someMethod(A a);

在hpp场景中,由于定义与实现都已经存在于一个文件,调用者必需明确知道被调用者的所有定义,而不能等到cpp中去编译。因此hpp中必须整理类之间调用关系,不可产生循环调用。同理,对于当两个类A和B分别定义在各自的hpp文件中,形如以下的循环调用也将导致编译错误:

//a.hpp
#include "b.hpp"
class A{
public :
	void someMethod(B b);
 //b.hpp
#include "a.hpp"
class B{
public :
	void someMethod(A a);

9、不可使用静态成员。

静态成员的使用限制在于如果类含有静态成员,则在hpp中必需加入静态成员初始化代码,当该hpp被多个文档include时,将产生符号重定义错误。唯一的例外是const static整型成员,因为在vs2003中,该类型允许在定义时初始化,如:

class A{
public:
	const static int intValue = 123;

由于静态成员的使用是很常见的场景,无法强制清除,因此可以考虑以下几种方式(以下示例均为同一类中方法)

1.类中仅有一个静态成员时,且仅有一个调用者时,可以通过局域静态变量模拟

//方法模拟获取静态成员
someType getMember()
	static someTypevalue(xxx);//作用域内静态变量
	return value;

2.类中有多个方法需要调用静态成员,而且可能存在多个静态成员时,可以将每个静态成员封装一个模拟方法,供其他方法调用。

someType getMemberA()
	static someTypevalue(xxx);//作用域内静态变量
	return value;
someType getMemberB()
	static someTypevalue(xxx);//作用域内静态变量
	return value;
void accessMemberA()
	someType member = getMemberA();//获取静态成员
//获取两个静态成员
void accessStaticMember()
       someType a  = getMemberA();//获取静态成员
       someType b = getMemberB();

3.第二种方法对于大部分情况是通用的,但是当所需的静态成员过多时,编写封装方法的工作量将非常巨大,在此种情况下,建议使用Singleton模式,将被调用类定义成普通类,然后使用Singleton将其变为全局唯一的对象进行调用。

如原h+cpp下的定义如下:

class A{
public :
	type getMember(){
		return member;
	static type member;//静态成员

采用singleton方式,实现代码可能如下(singleton实现请自行查阅相关文档)

//实际实现类
class Aprovider{
public :
        type getMember(){
           return member;
        type member;//变为普通成员
//提供给调用者的接口类
class A{
public :
        type getMember(){
           return Singleton<AProvider >::getInstance()->getMember();
                    hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库。hpp的优点不少,但是编写中有以下几点要注意:1、是Header   Plus   Plus 的简写。2、与*.h类
ITK官方论坛:[Insight-users] Difference between .cxx and .cpp, .txx and .h
OSCHINA开源中国:txx cxx cpp区别
github的issue:Recognize *.cxx, *.hxx, *.tpp, *txx, *.ipp, and *.ixx files as C++ #539
stack
				
1.声明和实现为什么要分开写 现在开始写项目了,你会发现我们一般都要写一个cpp,对应的还得有一个h文件,那么为什么在C++中我们要这么做? .h就是声明,.cpp就是实现,而所谓分离式实现就是指“声明”和“定义”分别保存在不同的文件中,声明保存在.h文件、定义保存在.cpp文件中。 那么将声明和定义分离有什么意义吗? 首先从非分离式(声明的同时给出定义)看,其内容一般保存在.h文件中,以供多个源文件引用。 但是将定义放在头文件,那么当多个源文件使用#include命令包含此类的头文件便会在链接阶段出现“m
简单讲,一个Package就是由同名的.h和.cpp文件组成。当然可以少其中任意一个文件: 只有.h文件的Package可以是接口或模板(template)的定义; 只有.cpp文件的Package可以是一个程序的入口。 .cppC++文件的扩展名,.h主要是进行函数定义的,类中函数的声明和调用是在.cpp中的,.h文件主要是把函数进行封装,在写很多代码的时候,用上.h有很好的作用,这时候我们只要给对方公司*.h文件就行了,这样既提供了必要的信息,又保护了我们的核心代码。在.cpp中对.h文件进行..
.c 用于数据结构的初始化及函数的具体实现。 在C++中,数据结构及函数的声明与实现进行分离的方式有两种:①.h、.cpp;②.hpp。 在①中,.h用于数据结构及函数的声明;.cpp用于数据结构的初始化及函数的具体实现。 在②中,,hpp即负责数据结构及函数的声明,同时负责数据结构的初始化及其函数的具体实现。 转到侧栏,然后导航到要下载的版本。 如果您想要最新的更改,则可以获取带有latest标签的发行版,也可以按版本进行发行。 不要克隆存储库,然后复制文件,该文件未包含所需的库。 如何使用 这是一个从BRS文件加载和读取不同内容的简单示例: # define BRS_BRICKADIA_IMPLEMENTATION_H # include " brs.hpp " # include < iostream> # include < filesystem> int main () BRS::Reader reader ( std::filesystem::current_path
每日一问15:C++中的.h,cpp以及.hpp文件 1. 编译器角度的头文件(.h)和源文件(.cpp) 先从编译器角度,来看一下头文件(.h)和源文件(.cpp): ​ 对于头文件(.h),在预处理阶段,头文件被包含到源文件后,它的使命就基本结束了。头文件包含了程序运行中可能需要用到的变量和函数等,在编译过程中,编译器只检查所使用的函数和变量的声明是否存在,对于源文件中的实现并不关心。源文件编译后成生成目标文件(obj文件),目标文件中,这些函数和变量就视作一个个符号。链接器会将所有的目标文件链接起来,
通俗解释:.h和.cpp差不多就像书和目录的关系吧,目录中对书中的章节和内容进行简单表示,真正的实现是在书里面的。 一般的数据,数据结构,接口,还有类的定义放在.h文件中,可以叫他们头文件,可以#include 到别的文件中。功能实现一般都放在具体的.cpp文件中,这样方便文件管理,节约时间,提高效率。 你完全可以把功能实现一并放在.h文件中,也可以#include一个.cpp文件到另一个源文件中...
.c、.cc、.h、.hpp 和 .cpp 这些文件扩展名代表了这个文件中包含的程序代码的类型和用途。 - .c 文件是 C 语言的源代码文件,包含 C 语言编写的函数和语句。 - .cc 文件是 C++ 的源代码文件,包含 C++ 编写的函数和语句。 - .h 文件是 C 语言的头文件,包含函数声明、常量定义等内容,用于被其他 C 源代码文件引用。 - .hpp 文件是 C++头文件,同样包含函数声明、常量定义等内容,用于被其他 C++ 源代码文件引用。 - .cpp 文件是 C++ 的源代码文件,包含 C++ 编写的函数和语句,与 .cc 文件功能相同。 总的来说,不同的文件扩展名代表了不同的代码类型和用途,有助于组织和管理代码。