#pragma once 和#define比较

今天被新来的实习生问起这个问题,为他解释耐心一番,顺便记录了下来。

事实上接触过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 once

class A {
...
};

b.cpp
#pragma once

class A {
...
};
这个时候就会重复定义了,当然这类问题,比较容易发现。

windows下推荐#pragma once是有道理的。



你可能感兴趣的:(windows)