C++中的hpp文件及使用hpp文件的好处

 更新时间:2024年02月17日 10:36:18   作者:马上到我碗里来  
hpp文件是C++程序中一种特殊头文件,它可以包含类的声明和实现,详细介绍了使用hpp文件的好处及注意事项,感兴趣的朋友跟随小编一起看看吧

1 什么是hpp文件?

hpp文件是C++程序中一种特殊头文件,它可以包含类的声明和实现。与传统的h文件相比,hpp文件具有以下特点:

  • 将类的声明和实现放在同一个文件里,减少了代码量,提高了代码的可读性。
  • 无需再将cpp加入到项目中进行编译,将代码直接编译到调用者的obj文件,不再生成单独的obj,大幅度减少编译次数。
  • 非常适合编写开源库,boost库大量使用模板,采样hpp的形式可以保持与各个编译器更好的兼容性。

2 使用hpp文件的好处

  • 减少代码量,提高代码可读性
  • 避免符号重定义错误
  • 提高编译效率
  • 方便编写开源库
  • 提高代码的可维护性

3 注意事项

与传统的h文件相比,hpp文件有很多优点,但是在编写hpp文件时也需要注意以下事项:

① 不可包含全局对象和全局函数

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

// 错误示例
#include <iostream>
int g_val = 0; // 全局对象
void print_val() {
  std::cout << g_val << std::endl;
}
// 正确示例
#include <iostream>
class MyClass {
 public:
  void print_val() {
    std::cout << m_val << std::endl;
  }
 private:
  int m_val = 0; // 类成员
};

② 类之间不可循环调用

如果hpp文件中包含多个类,并且这些类之间存在相互依赖关系,那么在编译时会导致循环依赖错误。为了避免这种情况,需要对类之间的依赖关系进行合理的设计,避免循环调用。

// 错误示例
#include <iostream>
class A {
 public:
  void foo(B& b) {
    // ...
  }
};
class B {
 public:
  void bar(A& a) {
    // ...
  }
};
// 正确示例
#include <iostream>
class A {
 public:
  void foo(B* b) {
    // ...
  }
};
class B {
 public:
  void bar(A* a) {
    // ...
  }
};

③ 不可使用静态成员

hpp文件中的静态成员在编译时会被编译到调用者的obj文件中,这会导致多个调用者共享同一个静态成员。如果静态成员发生变化,则会导致所有调用者都受到影响。因此,在hpp文件中应避免使用静态成员。

// 错误示例
#include <iostream>
class MyClass {
 public:
  static int s_val = 0; // 静态成员
  void print_val() {
    std::cout << s_val << std::endl;
  }
};
// 正确示例
#include <iostream>
class MyClass {
 public:
  void print_val() {
    int val = 0; // 局部变量
    std::cout << val << std::endl;
  }
};

④ 其他注意事项

  • 在hpp文件中可以使用#include预处理指令来包含其他头文件。
  • 在hpp文件中可以使用#pragma once预处理指令来避免重复包含。
  • 在hpp文件中可以使用using声明来简化代码。
// 示例
#include <iostream>
#include <vector>
#pragma once
using namespace std;
class MyClass {
 public:
  void print_val() {
    cout << m_val << endl;
  }
 private:
  int m_val = 0;
};

到此这篇关于C++中的hpp文件 的文章就介绍到这了,更多相关C++ hpp文件 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ list常用接口和模拟实现实例代码

    C++ list常用接口和模拟实现实例代码

    C++中list容器底层实现是使用带头双向循环链表的结构,通过指针指向前一个和后一个节点,它也具有双向链表的优缺点,下面给大家介绍C++ list常用接口和模拟实现代码,感兴趣的朋友一起看看吧
    2025-04-04
  • C语言文件操作详情(一)

    C语言文件操作详情(一)

    这篇文章主要介绍了C语言文件操作详情,主要讨论的是数据文件,通过处理的磁盘上的文件展开主题内容介绍,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-04-04
  • C++生成和解析XML文件的讲解

    C++生成和解析XML文件的讲解

    今天小编就为大家分享一篇关于C++生成和解析XML文件的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++分析讲解类的静态成员变量是什么

    C++分析讲解类的静态成员变量是什么

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存
    2022-04-04
  • C语言数据的存储超详细讲解中篇练习

    C语言数据的存储超详细讲解中篇练习

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-04-04
  • vector, list, map在遍历时删除符合条件的元素实现方法

    vector, list, map在遍历时删除符合条件的元素实现方法

    下面小编就为大家带来一篇vector, list, map在遍历时删除符合条件的元素实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C++11 并发指南之std::thread 详解

    C++11 并发指南之std::thread 详解

    这篇文章主要介绍了C++11 并发指南之std::thread 详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C语言 实现遍历一个文件夹的所有文件

    C语言 实现遍历一个文件夹的所有文件

    这篇文章主要介绍了C语言 实现遍历一个文件夹的所有文件的相关资料,需要的朋友可以参考下
    2017-01-01
  • C++中悬垂引用(Dangling Reference) 的实现

    C++中悬垂引用(Dangling Reference) 的实现

    C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣的可以了解一下
    2025-11-11
  • opencv3/C++ 实现SURF特征检测

    opencv3/C++ 实现SURF特征检测

    今天小编就为大家分享一篇opencv3/C++ 实现SURF特征检测,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12

最新评论