本文已参与「新人创作礼」活动,一起开启掘金创作之路。
游戏开发之.h、.c、.hpp及.cpp的区别
- 在C语言中,数据结构及函数的声明与实现进行分离有且仅有一种搭配方式:.h、.c .h 用于数据结构及函数的声明 .c 用于数据结构的初始化及函数的具体实现。
- 在C++中,数据结构及函数的声明与实现进行分离的方式有两种:①.h、.cpp;②.hpp。 在①中,.h用于数据结构及函数的声明;.cpp用于数据结构的初始化及函数的具体实现。 在②中,.hpp即负责数据结构及函数的声明,同时负责数据结构的初始化及其函数的具体实现。
- 在.c文件中,编译时期使用的是C语言编译器。在.cpp、.hpp文件中,编译期间使用的是C++编译器。
- 在C++中,使用.hpp文件在使用的过程中,无需如.h、.cpp那样将.cpp库进行导入project进行编译。且实现代码将直接编译到调用者的obj文件中,不在生成单独的obj文件。采用.hpp文件将大幅度减少调用project中的.cpp文件数与编译次数,也不用在发布lib与dll。非常适合用来编写公用的开源库。比如模板库。
TIPS:.h、.cpp在编译期间C++编译器会将其导入project进行编译且.cpp实现代码将会直接编译到obj文件中。即当我们引入该.h库的时候,不管该.h库在main.cpp(即主入口文件函数)使用include进来,都会进行编译。即比如该.h中实现文件(.cpp文件)声明一个全局对象,该.h库不管是否在主入口文件函数include,在编译期间都会创建该对象。
.hpp文件的概念及其应用
.hpp文件的概念
- .hpp文件是Header Plus Plus的简写。
- 与C语言的.h文件类似,.hpp文件是C++程序的头文件。
- .hpp文件是VC专用的头文件且已编译。
- .hpp文件一般是模板类的头文件。
- .h文件可以有using namespace std,即取消std的命名空间(建议不要随便取消std的命名空间)。而.hpp中没有这种操作。
- 使用.hpp文件要注意的问题:
①不可以包含全局对象及其全局函数。由于hpp本质上是作为.h被调用者include,所以当hpp文件中存在全局对象或者全局函数,而该hpp被多个调用者include时,将在链接时导致符号重定义错误。要避免这种情况,需要去除全局对象,将全局函数封装为类的静态方法。
②类之间不能循环调用。在.h和.cpp的使用场景中,当两个类或者多个类之间有循环调用关系时,只要预先在头文件做被调用类的声明即可,如下:
而在.hpp文件的使用场景中,由于定义与实现都已经存在于一个文件,调用者必需明确知道被调用者的所有定义,而不能等到.cpp中去编译。因此.hpp中必须整理类之间调用关系,不可产生循环调用。同理,对于当两个类A和B分别定义在各自的.hpp文件中,形如以下的循环调用也将导致编译错误:
③不能使用静态成员(包括静态成员函数和静态成员变量)。静态成员的使用限制在于如果类含有静态成员,则在hpp中必需加入静态成员初始化代码,当该hpp被多个文档include时,将产生符号重定义错误。唯 一的例外是const static整型成员。
.hpp文件的应用
8.31.hpp
#pragma once
class A
{
public:
void Print()
{
std::cout << "hello" << std::endl;
}
};
8.31.cpp
#include <iostream>
#include "8.31.hpp"
int main()
{
A a;
a.Print();
return 0;
}
版本声明:本文为CSDN博主[ufgnix0802]的原创文章。
原文链接:(blog.csdn.net/qq135595696…)