.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.Print();
    	return 0;
    

    版本声明:本文为CSDN博主[ufgnix0802]的原创文章。
    原文链接:(blog.csdn.net/qq135595696…)

    分类:
    后端
  •