首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >#pragma once用法总结

#pragma once用法总结

原创
作者头像
用户3672714
发布2025-09-04 15:11:15
发布2025-09-04 15:11:15
4530
举报

好的,我来帮你系统总结一下 #pragma once 的用法、原理及优缺点,方便 C/C++ 开发者快速理解。


🔹 #pragma once 基础

  • 作用:防止头文件被多次包含(Multiple Inclusion),避免重复定义错误。
  • 使用场景:通常放在 头文件(.h/.hpp)开头
  • 语法
代码语言:javascript
复制
#pragma once

1. 与传统 include guard 对比

传统 include guard

代码语言:javascript
复制
#ifndef MYHEADER_H
#define MYHEADER_H

// 头文件内容

#endif // MYHEADER_H

使用 #pragma once

代码语言:javascript
复制
#pragma once

// 头文件内容
  • #pragma once 更简洁,不需要定义宏名
  • 编译器自动确保文件只被包含一次

2. 使用示例

假设有两个头文件 A.hB.h

A.h

代码语言:javascript
复制
#pragma once
#include "B.h"

void funcA();

B.h

代码语言:javascript
复制
#pragma once

void funcB();

main.cpp

代码语言:javascript
复制
#include "A.h"
#include "B.h" // 即使这里再次包含 B.h,也不会重复编译

int main() {
    funcA();
    funcB();
    return 0;
}

✅ 编译器只会处理一次 B.h,避免重复定义。


3. 工作原理(原理简述)

  • 编译器在预处理阶段,记录已经处理过的文件路径
  • 如果同一文件再次被包含,则直接忽略
  • 比宏方式更高效,因为不需要预处理器多次展开宏检查

4. 优缺点

优点

  1. 简单明了,减少宏定义错误
  2. 避免宏命名冲突
  3. 编译速度通常比传统 include guard 更快(现代编译器)

缺点

  1. 非标准:不是 C/C++ 标准的一部分,但大多数现代编译器都支持(GCC、Clang、MSVC)
  2. 路径依赖:如果同一文件通过不同路径包含,可能失效
  3. 跨编译器兼容性:老旧编译器可能不支持

5. 注意事项

  1. 放在头文件最顶部,确保生效
  2. 不要与宏 include guard 冲突,可以同时使用(兼容老编译器):
代码语言:javascript
复制
#pragma once
#ifndef MYHEADER_H
#define MYHEADER_H

// 内容

#endif
  1. 尽量避免通过 不同相对/绝对路径重复包含同一文件

✅ 总结

特性

#pragma once

include guard

写法

简单,一行

需要宏定义

可读性

编译效率

高(现代编译器)

略低

标准化

非标准,但广泛支持

标准 C/C++

跨路径重复包含

可能有问题

完全可靠


💡 小技巧:

  • 对新项目推荐 #pragma once,简洁高效
  • 对需要兼容老编译器的项目,可以 pragma + include guard 双保险

我可以帮你画一张 #pragma once vs include guard 对比流程图,直观展示预处理器如何处理重复包含文件。

你希望我画吗?

https://www.52runoob.com/archives/6673

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🔹 #pragma once 基础
    • 1. 与传统 include guard 对比
      • 传统 include guard
      • 使用 #pragma once
    • 2. 使用示例
    • 3. 工作原理(原理简述)
    • 4. 优缺点
      • 优点
      • 缺点
    • 5. 注意事项
      • ✅ 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档