hpp文件:C++开发中的利器

1 什么是hpp文件?

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

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

2 使用hpp文件的好处

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

3 注意事项

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

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

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

c 复制代码
// 错误示例
#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文件中包含多个类,并且这些类之间存在相互依赖关系,那么在编译时会导致循环依赖错误。为了避免这种情况,需要对类之间的依赖关系进行合理的设计,避免循环调用。

c 复制代码
// 错误示例
#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文件中应避免使用静态成员。

c 复制代码
// 错误示例
#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声明来简化代码。
c 复制代码
// 示例
#include <iostream>
#include <vector>

#pragma once

using namespace std;

class MyClass {
 public:
  void print_val() {
    cout << m_val << endl;
  }

 private:
  int m_val = 0;
};
相关推荐
小莞尔6 分钟前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
我是菜鸟0713号27 分钟前
Qt 中 OPC UA 通讯实战
开发语言·qt
JCBP_29 分钟前
QT(4)
开发语言·汇编·c++·qt·算法
Brookty34 分钟前
【JavaEE】线程安全-内存可见性、指令全排序
java·开发语言·后端·java-ee·线程安全·内存可见性·指令重排序
百锦再1 小时前
[特殊字符] Python在CentOS系统执行深度指南
开发语言·python·plotly·django·centos·virtualenv·pygame
Anson Jiang1 小时前
浏览器标签页管理:使用chrome.tabs API实现新建、切换、抓取内容——Chrome插件开发从入门到精通系列教程06
开发语言·前端·javascript·chrome·ecmascript·chrome devtools·chrome插件
会开花的二叉树1 小时前
继承与组合:C++面向对象的核心
java·开发语言·c++
潮汐退涨月冷风霜2 小时前
数字图像处理(1)OpenCV C++ & Opencv Python显示图像和视频
c++·python·opencv
长河3 小时前
Java开发者LLM实战——LangChain4j最新版教学知识库实战
java·开发语言
第七序章3 小时前
【C++STL】list的详细用法和底层实现
c语言·c++·自然语言处理·list