#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
原创粉丝点击