当前位置: 首页 > news >正文

【C++】头文件的能力与禁忌

在C++中,​头文件(.h/.hpp)​​ 的主要作用是声明接口和共享代码,但如果不规范使用,会导致编译或链接错误。以下是详细总结:

一、头文件中可以做的事情

1.1 声明

  • 函数声明(无需inline)
// utils.h
void print(); // 声明
  • 类或者结构体声明
class MyClass {
public:void foo(); // 成员函数声明
};
  • 外部变量声明(用extern)
    如果不想用extern,可以使用C++17支持的内联全局变量
extern int globalVar; // 声明,定义在.cpp中

1.2 定义

  • 内联函数的定义
inline int add(int a, int b) { return a + b; } // 解决ODR问题
  • 类或者结构体成员函数定义
class Vector {
public:float x, y;float length() const { return std::sqrt(x*x + y*y); } // 隐式inline
};
  • 模板定义
template<typename T>
T max(T a, T b) { return (a > b) ? a : b; } // 模板必须完整定义在头文件
  • 常量表达式(C++11)
constexpr float PI = 3.1415926f; // 内部链接,每个编译单元独立副本
  • C++17内联变量
inline int globalConfig = 42; // 允许头文件中定义全局变量

1.3 其他

  • 宏定义​(谨慎使用)
  • 类型别名(using 或者 typedef)
  • 命名空间

二、头文件中不可以做的事情

1.1 普通函数定义

原因​:违反ODR规则,多个编译单元生成相同符号,链接冲突。

// utils.h
void print() { std::cout << "Hello"; } // ❌ 多个.cpp包含时链接错误

1.2 非内联全局变量定义

int globalVar = 42; // ❌ 多个.cpp包含时链接错误

1.3 静态全局变量

问题​:每个包含该头文件的.cpp会生成独立的 localVar,浪费内存。

static int localVar = 0; // ⚠️ 每个编译单元独立副本,可能不符合预期

1.4 复杂代码逻辑​

避免在头文件中写长函数或复杂逻辑​(如文件操作、动态内存分配)。
​原因​:增加编译时间,代码膨胀。

http://www.lqws.cn/news/602893.html

相关文章:

  • BFD故障检测技术之概述
  • 【ArcGIS】矢量数据的叠加分析
  • 类加载生命周期与内存区域详解
  • 胖喵安初 (azi) Android 应用初始化库 (类似 Termux)
  • 物联网数据洪流下,TDengine 如何助 ThingLinks 实现 SaaS 平台毫秒级响应?
  • k8s将service的IP对应的不同端口分配到不同的pod上
  • 主流零信任安全产品深度介绍
  • 蓝牙音频传输协议深度解析:A2DP、HFP、AVRCP 对比与面试核心考点
  • ECOVADIS评级提升的关键策略,ECOVADIS评级体系
  • (论文总结)语言模型中的多模态思维链推理
  • DBA 命令全面指南:核心操作、语法与最佳实践
  • C语言再学习—内存,链表
  • React Native 接入 eCharts
  • RocketMQ延迟消息是如何实现的?
  • 前端处理跨域的4种方式
  • 为什么js是单线程?
  • 转录组分析流程(七):GSEA分析
  • 安装emsdk 4.0.10报Connection reset by peer解决
  • OpenCV篇——项目(一)OCR识别读取银行卡号码
  • 内部类与Lambda的衍生关系(了解学习内部类,Lambda一篇即可)
  • Windows10/11 轻度优化 纯净版,12个版本!
  • 【分治思想】归并排序 与 逆序对
  • Nginx重定向协议冲突解决方案:The plain HTTP request was sent to HTTPS port
  • CertiK《Hack3d:2025年第二季度及上半年Web3.0安全报告》(附报告全文链接)
  • OEM怎么掌握软件开发能力
  • 记本好书:矩阵力量:线性代数全彩图解+微课+Python编程
  • Python OrderedDict 用法详解
  • 学习昇腾开发的第11天--主要接口调用流程
  • CMU-15445(6)——PROJECT#2-BPlusTree-Task#1
  • 记一次Ubuntu22安装MongoDB8并同步本地数据过程