c++头文件怎么写 c++ .h与.cpp分离编写【技巧】

13次阅读

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

c++头文件怎么写 c++ .h与.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 变量天然内联,适合放头文件,也推荐用于代替宏常量

不复杂但容易忽略

text=ZqhQzanResources