当前位置: 首页 > 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.dtcms.com/a/264381.html

相关文章:

  • [Python 基础课程]数字
  • wrap+aria2c提高下载速度
  • 创宇智脑 MCP 赋能 AiPy,IP 风险调查效率实现 10 倍飞跃,威胁分析一键生成
  • c语言中的函数I
  • NV103NV105美光固态闪存NV107NV108
  • Python OrderedDict 用法详解
  • 【1.7 漫画Java核心并发编程】
  • 【硬核拆解】英伟达Blackwell芯片架构如何重构AI算力边界?
  • 第六章 OpenCV篇—傅里叶变换与直方图
  • 学习字符串
  • Flask+LayUI开发手记(十):构建统一的选项集合服务
  • Rust 定义与实例化结构体
  • php数据导出pdf文件
  • 目标检测系列(五)已标注数据集(yolo格式)导入labelstudio继续标注
  • 浏览器工作原理32 [#]同源策略:为什么XMLHttpRequst不能跨域请求资源
  • Android11 添加自定义物理按键事件监听回调
  • Nginx重定向协议冲突解决方案:The plain HTTP request was sent to HTTPS port
  • uniapp选择相册
  • CAD文件处理控件Aspose.CAD教程:使用 Python 将绘图转换为 Photoshop
  • 【基础】Golang 执行命令shell命令 + Start和Run方法详解
  • ES6数组的`flat()`和`flatMap()`函数用法
  • 黑马python(二十三)
  • vue2 el-select下拉选择框 点击其他位置或者弹窗关闭下拉框/点击取消时,下拉框变成之前的值
  • 2025年跨端云真机测试平台深度测评:XR与折叠屏时代的兼容性之战
  • 《量化开发》系列 第 1 篇:金融知识基础入门指南(附 GitHub 学习项目)
  • 什么是 BigKey?
  • 定时器的设计
  • 电源芯片之DCDC初探索ING
  • 用lines_gauss的width属性提取缺陷
  • 视频内存太大怎么压缩变小一点?视频压缩的常用方法