今天被新来的实习生问起这个问题,为他解释耐心一番,顺便记录了下来。
事实上接触过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_5F6B35