最后更新: 26 Feb, 2026

在编写 C++ 程序时,尤其是大型项目,组织代码到多个文件中对于可读性和维护性至关重要。这通常涉及使用 头文件,其扩展名为 .h 或 .hpp。但这两者有什么区别,应该使用哪一个?
在本文中,我们将拆解 .h 与 .hpp 文件的差异,探讨它们的历史,并提供最佳实践指南。
理解 C++ 中的头文件
头文件包含 声明,如函数、类、常量和宏,您可以在多个源文件中包含它们。这些文件随后在 .cpp(C++ 源)文件中通过 #include 指令引入。
头文件的常见内容
- 类定义
- 函数声明
- 常量定义
- 宏
- 模板(在某些情况下)
.h 文件
什么是 .h 文件?
.h 文件是传统的 头文件,最早在 C 编程语言中广泛使用。它们仍然在 C 和 C++ 项目中用于声明接口。
使用示例:
// mathutils.h
#ifndef MATHUTILS_H
#define MATHUTILS_H
int add(int a, int b);
int subtract(int a, int b);
#endif
优点:
- 在 C 和 C++ 中都被普遍认可。
- 适用于同时包含 C 与 C++ 代码的项目。
缺点:
- 在 C++ 项目中可能导致文件是 C 风格还是 C++ 风格的歧义。
.hpp 文件
什么是 .hpp 文件?
.hpp 文件是专用于 C++ 的头文件。它们的功能与 .h 文件相同,但用于 明确表示 该头文件面向 C++ 代码。
使用示例:
// vectorutils.hpp
#ifndef VECTORUTILS_HPP
#define VECTORUTILS_HPP
#include <vector>
std::vector<int> filter_even(const std::vector<int>& input);
#endif
优点:
- 明确表示文件是针对 C++ 的。
- 在混合 C 与 C++ 时避免混淆。
- 对于遵循严格命名约定的混合语言项目或团队非常有帮助。
缺点:
- 在较旧的代码库中稍显不常见。
- 某些期望
.h的遗留系统可能不识别。
.h 与 .hpp:关键区别
| 特性 | .h 文件 | .hpp 文件 |
|---|---|---|
| 语言关联 | C 和 C++ | 仅 C++ |
| 约定或规则? | 约定 | 约定 |
| 在 C++ 项目中的使用 | 常见 | 部分人因清晰度而偏好 |
| 模板支持 | 是 | 是 |
| 代码歧义 | 在混合语言项目中可能出现 | 不太可能 |
选择 .h 与 .hpp 的最佳实践
以下是一些帮助您做出选择的一般指南:
如果使用 .h:
- 您的代码必须兼容 C 与 C++。
- 您正在维护或扩展已经使用
.h的遗留代码。
如果使用 .hpp:
- 您希望明确表明文件是 C++ 专用的。
- 您在仅 C++ 项目中工作,或使用 C++ 特有的特性,如类、模板和命名空间。
常见项目结构
使用 .h 的示例:
project/
├── main.cpp
├── mathutils.h
└── mathutils.cpp
使用 .hpp 的示例:
project/
├── main.cpp
├── vectorutils.hpp
└── vectorutils.cpp
两种结构均有效,区别主要在于清晰度和团队偏好。
结论
在 .h 与 .hpp 之间的选择主要是 约定 而非功能差异。它们的目的相同:在多个 C++ 源文件之间声明接口和共享代码。
然而,对于专属 C++ 的代码,使用 .hpp 可以更清晰地表达意图,帮助避免在大型代码库(尤其是涉及多语言的项目)中的混淆。对于混合语言或遗留项目,.h 仍可能是更合适的选择。
关键要点:
当您想表明“这仅是 C++ 代码”时使用
.hpp—— 如果您在 C 与 C++ 混合的环境中工作,则继续使用.h。