讲师中心 微信公众号
AI工具推荐 视频效率加速

c++中如何防止头文件重复包含_c++ #ifndef与#pragma once区别【实例】

阿瑶小哥_3267

阿瑶小哥_3267

发布时间:2026-01-22 15:51:09

|

643人浏览过

|

来源于php中文网

原创

应优先使用 #ifndef / #define / #endif,因其是标准、可移植、可靠;#pragma once 虽简洁但非标准,存在文件系统依赖和兼容性风险。

c++中如何防止头文件重复包含_c++ #ifndef与#pragma once区别【实例】

用 #ifndef 或 #pragma once 都能防止头文件重复包含,但它们机制不同、兼容性不同、行为边界也不同——选错可能在跨平台或大型项目中埋坑。

为什么重复包含头文件会出问题

多次包含同一头文件,会导致符号重定义(比如类重复声明、函数重复声明)、模板实例化冲突、编译变慢。C++ 标准不保证头文件被多次包含时的行为安全,必须主动防护。

常见触发场景:

  • 多个头文件都 #include "common.h",而它们又被同一个 .cpp 同时包含
  • 继承链中间接包含同一头文件(A.h → B.h → C.h,同时 A.h → C.h)

#ifndef / #define / #endif 是标准、可控、可移植的方案

它依赖宏名唯一性,由预处理器在文本层面判断是否跳过内容。只要宏名不冲突,就可靠。

立即学习“C++免费学习笔记(深入)”;

典型写法(注意命名规范):

Miller CSV TSV JSON 数据处理器
Miller CSV TSV JSON 数据处理器

Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。

下载
#ifndef MYLIB_VECTOR_H_
#define MYLIB_VECTOR_H_
<h1>include <memory></h1><p>namespace mylib {
template<typename T> class vector { /<em> ... </em>/ };
} // namespace mylib</p><h1>endif // MYLIB_VECTOR<em>H</em>

关键点:

  • 宏名建议用 大写 + 下划线 + 文件路径信息(如 UTILS_LOG_H_),避免和用户代码/第三方库冲突
  • 必须成对出现:#ifndef 和 #endif 之间不能有未配对的条件编译指令
  • 支持所有符合标准的预处理器(GCC、Clang、MSVC、ICC 等),无兼容性风险
  • 即使头文件被 #include <...> 和 #include "..." 同时引用,也能正确识别为同一文件(靠路径字符串匹配)

#pragma once 是编译器扩展,简洁但有隐含限制

它让编译器直接按物理文件路径做去重,不依赖宏名,写起来更轻量:

#pragma once
<h1>include <memory></h1><p>namespace mylib {
template<typename T> class vector { /<em> ... </em>/ };
}

但它的问题藏在细节里:

  • 不是 C++ 标准特性,虽被 GCC/Clang/MSVC 广泛支持,但某些嵌入式工具链或老版本编译器(如早期 TI C++ 编译器)可能不识别
  • 对硬链接、符号链接、网络文件系统(NFS)、生成头文件(如通过 CMake configure_file 生成)等场景识别不稳定——同一逻辑头文件若路径不同,#pragma once 可能认为是两个文件
  • 无法处理“不同路径指向同一文件”的情况(例如 /src/a.h 和 /build/src/a.h 是硬链接),而 #ifndef 因宏名相同仍能生效
  • 宏名冲突的风险被规避了,但换来的是对文件系统语义的强依赖

实际项目中怎么选

没有绝对优劣,只有上下文适配:

  • 开源库、跨平台 SDK、需长期维护的底层模块:优先用 #ifndef,确保可预测性和最大兼容性
  • 公司内部 MSVC/Clang 主导的项目,且构建环境统一、无符号链接/NFS:可用 #pragma once 提高可读性,但需在 CI 中验证所有目标平台
  • 混合使用?不推荐。同一项目中混用会让新人困惑,且 IDE 的头文件导航、静态分析工具可能表现不一致
  • 现代建议:用 #pragma once + 保留 #ifndef 注释作为兜底(非强制,仅提醒),但不要真写两套防护

真正容易被忽略的是:头文件防护只是第一道防线;如果头文件本身有定义非内联函数、全局变量或模板以外的实体,还需配合 inline、static、extern 或定义分离(声明放头文件,定义放 .cpp)来避免 ODR 违规——防护宏管不了链接期错误。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

相关专题

更多
typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

313

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

619

2023.10.11

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

3805

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

1570

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1578

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2284

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5824

2023.10.24

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

160

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
夸克AI浏览器使用手册
夸克AI浏览器使用手册

共0课时 | 0人学习

jQuery官方API文档
jQuery官方API文档

共0课时 | 0人学习

Manus AI 入门手册
Manus AI 入门手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn