c++如何避免头文件重复包含 c++ #pragma once与#ifndef【必看】
发布时间 - 2026-01-07 00:00:00 点击率:次头文件重复包含指同一头文件被多次包含导致编译错误,可用#pragma once或#ifndef宏卫士防护;前者简洁高效但非标准,后者标准兼容但易出错;现代项目优先选#pragma once,严格兼容场景用#ifndef。
在C++中,头文件重复包含会导致编译错误(如重定义、多重声明)或链接问题。避免重复包含主要有两种标准方式:#pragma once 和传统的 #ifndef 宏卫士(include guards),它们作用相同但机制和兼容性不同。
什么是头文件重复包含?
当一个头文件被多个源文件直接或间接包含多次时,若没有防护措施,其内容(如类定义、函数声明、宏等)就会被多次展开,引发编译器报错。例如:A.h 被 B.cpp 和 C.cpp 同时包含,而 B.cpp 又通过 C.h 二次引入了 A.h —— 这就容易触发重复包含。
#pragma once 的用法与特点
#pragma once 是编译器指令,写在头文件最开头,告诉编译器“该文件只被包含一次”。它简洁、易读、不易出错。
- 只需一行:
#pragma once,无需命名、无配对要求 - 由主流编译器(MSVC、Clang、GCC 以来较新版本)原生支持,效率略高(基于文件路径判断)
- 不依赖宏名,避免宏名冲突或拼写错误
- 缺点:非C++标准特性,极少数老旧或嵌入式编译器可能不支持;对硬链接/符号链接处理存在个别差异
#ifndef 宏卫士的标准写法
这是ISO C++标准支持的方式,通过预处理器宏控制是否跳过内容:

#ifndef MY_HEADER_H #define MY_HEADER_H // 头文件主体内容(类、函数声明等) #endif // MY_HEADER_H
- 宏名一般用大写+下划线,按惯例基于文件名(如
STRING_UTILS_H),确保全局唯一 - 必须严格配对:
#ifndef/#define/#endif,且宏名前后一致 - 完全可移植,所有符合标准的编译器都支持
- 风险点:宏名重复(尤其大型项目)、忘记
#define或拼错宏名,会导致失效
怎么选?实用建议
现代项目推荐优先使用 #pragma once,尤其在团队统一使用 Clang/GCC/MSVC 的场景下。它更安全、更简洁、更难误用。
- 若需100%标准兼容(如提交到开源库、支持极端老旧工具链),用
#ifndef更稳妥 - 不必两者共存——混用不会出错,但无必要,反而增加冗余
- 注意:二者都**不能防止头文件内容本身的重复定义**(比如在头文件里写函数实现),这类问题需靠
inline、static或分离声明/定义来解决
不复杂但容易忽略——加一句防护,省去大量编译报错排查时间。
# 处理器
# 工具
# c++
# 编译错误
# Static
# define
# include
# 预处理器
# 头文件
# 报错
# 老旧
# 这是
# 就会
# 一句
# 多个
# 下划线
# 只需
# 这就
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
javascript中的try catch异常捕获机制用法分析
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
详解Huffman编码算法之Java实现
Laravel如何生成URL和重定向?(路由助手函数)
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
如何在 Pandas 中基于一列条件计算另一列的分组均值
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
Bootstrap整体框架之CSS12栅格系统
如何在服务器上三步完成建站并提升流量?
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
再谈Python中的字符串与字符编码(推荐)
EditPlus中的正则表达式实战(6)
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
轻松掌握MySQL函数中的last_insert_id()
如何挑选最适合建站的高性能VPS主机?
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
如何在万网自助建站平台快速创建网站?
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
高防服务器:AI智能防御DDoS攻击与数据安全保障
如何彻底卸载建站之星软件?
黑客如何通过漏洞一步步攻陷网站服务器?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
如何用免费手机建站系统零基础打造专业网站?
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
UC浏览器如何设置启动页 UC浏览器启动页设置方法
如何在阿里云完成域名注册与建站?
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
bootstrap日历插件datetimepicker使用方法
中山网站推广排名,中山信息港登录入口?
海南网站制作公司有哪些,海口网是哪家的?
开心动漫网站制作软件下载,十分开心动画为何停播?
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
如何快速配置高效服务器建站软件?
如何用wdcp快速搭建高效网站?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
Java垃圾回收器的方法和原理总结
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
node.js报错:Cannot find module 'ejs'的解决办法
高防服务器租用指南:配置选择与快速部署攻略
如何在IIS中新建站点并配置端口与物理路径?
上一篇:nginx运维中怎么样平滑升级
下一篇:Apache支持Ruby程序吗?
上一篇:nginx运维中怎么样平滑升级
下一篇:Apache支持Ruby程序吗?

