C++头文件应加include guard或#pragma once防重复包含,只声明类、函数、extern变量等接口,不放实现;const和inline内容可安全放入头文件;.cpp专注实现并精简包含。

头文件(.h)负责声明,源文件(.cpp)负责实现——这是 C++ 分离编写的底层逻辑。写错头文件,轻则重复定义报错,重则链接失败或行为异常。核心就三点:防重复包含、声明与定义分离、接口清晰。
头文件必须加 include guard 或 #pragma once
没有防护的头文件一旦被多个 .cpp 包含,就会导致符号重定义。推荐用 #pragma once(简洁、主流编译器都支持),也可用传统宏卫士:
- #ifndef MYCLASS_H
- #define MYCLASS_H
- /* 类声明、函数声明、extern 变量声明等 */
- #endif // MYCLASS_H
注意:宏名要唯一,一般用大写文件名+下划线(如 VECTOR_H),避免用 _ 开头(C++ 标准保留)。
头文件里只放“能被别人看到”的东西
声明是给使用者看的契约,不是实现细节。以下可以放:
立即学习“C++免费学习笔记(深入)”;
- 类定义(含 public/private 成员声明、构造/析构/成员函数声明)
- 函数声明(不写函数体,例如 void print();)
- extern 全局变量声明(extern int g_count;)
- using 声明(如 using std::string;),但慎用,避免污染全局命名空间
- 模板定义(模板必须在头文件中实现,因为编译器需要看到完整定义才能实例化)
以下绝对不能放:
- 函数定义(除非是 inline 或 constexpr)
- 非 const 全局变量定义(会引发 ODR 违规)
- 静态局部变量、static 函数定义
- main() 函数
.cpp 文件专注实现,且只包含真正需要的头
每个 .cpp 应包含对应的 .h(如 MyClass.cpp 包含 "MyClass.h"),再按需引入标准库或其他依赖头。不要在 .h 里无脑 #include 大量头文件——那会拖慢所有包含它的编译速度。
- 优先用前向声明(class OtherClass;)替代 #include,尤其当只需要指针/引用时
- 把只在 .cpp 内部用到的头(如
stream> )移到 .cpp 里,不放进 .h - 实现成员函数时,类作用域写法更清晰:void MyClass::doSomething() { ... }
const 变量和 inline 函数可安全放在头文件中
全局 const 变量默认具有内部链接(internal linkage),所以 const int MAX_SIZE = 100; 放头文件不会冲突;inline 函数同理(编译器保证只有一份实例)。但要注意:
- 如果想让 const 变量有外部链接(供其他文件取地址),得显式加 extern const int MAX_SIZE; 声明在 .h,再在某个 .cpp 中定义
- constexpr 变量天然内联,适合放头文件,也推荐用于代替宏常量
不复杂但容易忽略











