【C/C++】pragma once 与 #ifndef 解析

作用:#pragma once 和#ifndef 都可以避免同一个文件被include多次。

1. #pragma once方式

#pragma once 是编译器相关,移植型差,不是所有编译器都支持,比如:gcc,vs 编译器支持,bcc 编译器不支持。由编译器提供保证,同一个文件不会被包含多次。这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。不用像使用 #ifdef 一样想宏名了,当然也就可以避免宏的名字冲突问题。缺点:如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。

    #pragma once
    ... ... // 声明、定义语句

2. #ifndef 方式

#ifndef 是 C 语言相关的,通过宏定义避免文件多次编译。所以在所有支持C/C++ 语言的编译器上都是有效的。跨平台移植性好。它依赖于宏名避免被 include 多次,如果宏已经定义了,#ifndef 将不满足条件,在预处理时,直到 #endif 处的代码会被直接删除。 这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被同时包含,只认识宏,不管是不是相同的代码或者这是哪个文件。为了保证不同头文件中的宏名不冲突,使用文件名定义宏,例如文件名为 abc.h,就定义宏为 ABC_H

    #ifndef __SOMEFILE_H__
    #define __SOMEFILE_H__
    ... ... // 声明、定义语句
    #endif

3 总结

性能区别
  • 当编译器遇到“ifndef”时,如果发现这个已经被编译,会一直向下忽略,直到遇到“endif” ,也就是说,使用“ifndef”时 虽然没有编译第二遍, 但是文件依然是会被读取的。
  • “pragma”拥有更高的效率,如果是使用“pragma once” 编译器会直接停止编译该文件。
编码风格
  • 使用 #pragma once 的代码简洁
  • #ifndef 定义如下:#ifndef…#define…#endif
语意区别

#pragma once 针对文件,它告诉编译器,本文件只编译一次。
#ifndef…#define…#endif 是针对文件中的某一个标号而言的,防止三个指令间包含的内容的重复性处理,更灵活。

可移植性方面
  • #pragma once 依赖于编译器,可移植性较差
  • #ifndef…#define…#endif 是 C/C++ 标准中的一部分,支持 C/C++ 的编译器都能使用,可移植性更高。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值