博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于#pragma once和#ifndefine组合的区别
阅读量:4550 次
发布时间:2019-06-08

本文共 1033 字,大约阅读时间需要 3 分钟。

最近在看duilib代码,发现头文件既有#pragma once 又有 #ifndefine...#define,忽然就觉得有点不解,因为据我所知这两者都是防止头文件二次包含的。

经过下面两位的解释后,加深了认识:

总结一下:

1.#pragma是微软独有的,不能跨平台使用,我印象中#pragma是编译器相关指令吧,当然就是与编译器相关的了

2.然后#ifndefine存在弊端:

(引用上面参考的原文)

<第一种:file1头文件中有一个宏

//file1.h

#define BOOK_H   //宏名

现在又有一个文件 book.h 里面使用了宏定义方式防止头文件二次编译

#ifndef BOOK_H

#define BOOK_H

//  program codes

#endif

下面是你的主函数所在文件内容

#include"fil1.h"

#include"book.h"   //这两个都是你自己的头文件

#include<........>

..................

预编译阶段把file1文件展开,就得到了宏 BOOK_H,在处理book.h文件时就发现BOOK_H这个宏已经存在了,就不会包含book.h头文件了,这就是弊端所在了。>

也就是说,如果自己在头文件a中定义了和头文件b一样的宏,就会导致b没有包含进去,不过这种可能性还是比较少的,因为#ifndefine 的宏名称都相对比较特殊,类似: _File_NAME_H_  什么的

 

3.效率也存在差异: 由于编译器每次都需要打开头文件才能判定是否有重复定义,因此在编译大型项目时,ifndef会使得编译时间相对较长

 

4.#pragma 针对文件,不能在某段代码中插入

 

5.两者一起用的情况:

duilib的一段代码:

#ifndef __UIBASE_H__

#define __UIBASE_H__
#pragma once

。。。

 (引用上面参考的原文) < 看起来似乎是想兼有两者的优点。不过只要使用了#ifndef就会有宏名冲突的危险,也无法避免不支持#pragma once的编译器报错,所以混用两种方法似乎不能带来

  更多的好处,倒是会让一些不熟悉的人感到困惑。>

所以我对duilib里面两者一起用的情况确实有点不解,其实是两种缺点都包含了吧,又不是优点整合吧

 

转载于:https://www.cnblogs.com/riversHahaha/p/4570104.html

你可能感兴趣的文章
<poj 1046>Color Me Less
查看>>
常用的swiper
查看>>
node exports
查看>>
容易出错的 if 语句
查看>>
Source not found问题
查看>>
linux下vi命令大全
查看>>
C#中使用7Z进行压缩解压
查看>>
python之auto鼠标/键盘事件
查看>>
No module named scrapy 成功安装scrapy,却无法import的解决方法
查看>>
使用splash爬去JavaScript动态请求的内容
查看>>
2019北航面向对象课程第四单元作业(UML图)个人总结
查看>>
css布局口诀
查看>>
单元测试---Mock
查看>>
antd做form表单的组件共用,利用mapPropsToFields填写默认值
查看>>
捕捉攻击者
查看>>
【数轴染色+并查集路径压缩+加速】数轴染色
查看>>
雅虎的工程师团队给出的35个web开发最佳实践
查看>>
2723:因子问题
查看>>
十进制转为x进制的递归代码
查看>>
ARM寄存器详解
查看>>