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;
};
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/ningmoon/article/details/136115538