#pragma once 和#define比较
来源:互联网 发布:linux acl 编辑:程序博客网 时间:2024/06/04 17:42
今天被新来的实习生问起这个问题,为他解释耐心一番,顺便记录了下来。
事实上接触过windows编程的人都会遇到#pragma once,并且被推荐使用。
它们都是避免重复编译,那到底有没有区别。
答案是有,区别很细微。
先来看看header guard的方式:
#ifndef __A_HEADER_GUARD__#define __A_HEADER_GUARD__ ...#endif
可以看到,应用了宏保护的方式,若在宏包围中的内容不会被重复包含。
当然可以看到一个问题,是这个宏名是有可能重复的。
两个不同的文件使用了相同的宏名,但是声明了不同的东西,就会出现其中一个没有声明的情况。
代码形如:
a.cpp#ifndef __collision__#define __collision__class A{...};#endif
和
b.cpp#ifndef __collision__#define __collision__class B{...};#endif这种会让人抓狂的,明明声明了,就是找不到声明。在windows下面,习惯生成一个GUID作为宏名,来保证唯一性,比如:
#ifndef __A_5F6B353A_9582_46ca_94C5_52CC6C64F8B0#define __A_5F6B353A_9582_46ca_94C5_52CC6C64F8B0//GUID: {5F6B353A-9582-46ca-94C5-52CC6C64F8B0}#endif
这个时候显然#pragma once就发挥出它的优势了,因为不需要为找到一个唯一的名字而烦恼。
当然这个也是有缺憾的。
如果两个不同的文件是定义了相同的内容,就会出现重复定义。
例如:
a.cpp#pragma onceclass A {...};和
b.cpp#pragma onceclass A {...};这个时候就会重复定义了,当然这类问题,比较容易发现。
windows下推荐#pragma once是有道理的。
0 0
- #pragma once 和#define比较
- #pragma once 和#ifndef ... #define ... #endif 比较
- #pragma once 和#ifndef ... #define ... #endif 比较
- #pragma once 和#ifndef ... #define ... #endif 比较
- #pragma once 和#ifndef ... #define ... #endif 比较
- #pragma once 和#ifndef ... #define ... #endif 比较
- #pragma once 和#ifndef ... #define ... #endif 比较
- [Windows编程] #pragma once 和#ifndef ... #define ... #endif 比较
- #pragma once 和 #ifndef,#define,#endif
- #ifndef,#define,#endif和#pragma once
- #pragma once和#ifndef,#define,#endif
- #pragma once与#ifndef #define #endif的区别 (比较全)
- #pragma once 与 #ifndef...#define...#endif的比较
- 小议#pragma once 和 #ifndef #define #endif的区别
- #pragma once 和 #ifndef ... #define ... #endif 的区别【转载】
- #pragma once和#ifndef / #define / #endif的区别
- #pragma once 和 #ifndef ... #define ... #endif 的区别【转载】
- #pragma once和#ifndef,#define,#endif的区别
- HDOJ2844-Coins(DP)
- Java知识(008)--面向对象入门
- 一篇关于营销的功能需求分析
- POJ 2986 A Triangle and a Circle
- java解惑--令人混淆的构造器案例
- #pragma once 和#define比较
- UVa10491 - Cows and Cars(概率)
- C++ primer 读书笔记(第1章)开始
- Python IDLE
- 习题3—15
- C++随机函数
- Flask-HelloWorld-07 数据库
- R网络爬虫之批量下载
- Linux 下用 dd 命令生成一个指定大小的虚拟块设备文件