最后更新: 26 Feb, 2026

标题 - .h 与 .hpp:有什么区别,应该使用哪一个?

在编写 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

另请参阅