对于同一个函数,某些修饰符(关键词)可以写在 .hpp
中,但即使在 .cpp
中不写
C++ 中有一类修饰符属于声明限定符(declaration specifiers),它们影响声明语义,但不是函数签名(signature)的一部分。所以你写在 .hpp
中即可,.cpp
中可以不写。
修饰符 | .hpp 写 | .cpp 可以不写? | 是否推荐这样写? | 说明 |
---|---|---|---|---|
inline | ✅ | ✅ 是 | ✅ 推荐 | 用于 header-only 定义 |
virtual | ✅ | ✅ 是 | ✅ 推荐 | 仅在声明处需要写 |
override | ✅ | ❌(定义处不能写) | ✅ 推荐 | 仅做声明期检查 |
final | ✅ | ❌(定义处不能写) | ✅ 推荐 | 和 override 类似 |
explicit | ✅ | ❌(只能在声明中) | ✅ 推荐 | 仅限构造函数声明 |
对于同一个函数,某些修饰符可以写在 .cpp
中定义时添加,而在 .hpp
中声明时省略,依然合法
修饰符 | .cpp 中单独写合法? | .hpp 中可省略? | 是否影响签名? | 说明 |
---|---|---|---|---|
inline | ✅ 合法 | ✅ 可省略 | ❌ 否 | .cpp 中加 inline 是提示优化器,可省略声明处 |
static | ✅ 合法 | ✅ 可省略 | ❌ 否 | 改变链接属性,仅影响该 .cpp 内可见性 |
[[nodiscard]] 等属性 | ✅ 合法 | ✅ 可省略 | ❌ 否 | 编译器属性标注,不改变匹配规则 |
__attribute__ (GCC/Clang) | ✅ 合法 | ✅ 可省略 | ❌ 否 | 编译器扩展,可只写在定义中 |
inline static (变量) | ✅ 合法 | ❌ .hpp 中写才有意义 | ❌ 否 | 常见于 header-only 模式,建议写在头文件 |
建议(正式、专业):
-
对于不影响链接/类型的修饰符(如
inline
,virtual
,override
),你可以只在.hpp
写,.cpp
中不必重复。 -
对于影响类型/签名的修饰符(如
const
,constexpr
,noexcept
),必须.hpp/.cpp
保持一致,否则报错或类型不匹配。 -
出于可读性和一致性考虑,建议尽可能在定义中也保留
.hpp
中的修饰符(特别是内联函数、常量表达式函数)。