C++中的pragma和#ifndef组合语句的联系与区别

在C++中,为了避免同一个文件被include多次,常常需要在文中加上一些保证,主要有两种方式,二者用法如下:

1
#pragma once

1
2
3
4
5
#ifndef __HEAD__
#define __HEAD__


#endif

通常,在能够支持这两种方式的编译器上,二者没有太大的区别。下面简介说一下二者格子的优缺点:

对于#ifndef方式来说,不光可以保证同一个文件不会被包含多级,也能保证内容完全相同的两个文件不会被不小心同时包含,但这样就需要编译器每次都扫描头文件内部,因此会使得编译时间相对较长。另外一个缺点就是该方式需要自定义宏名称,当项目很大时,宏名称有“撞车”的风险。

对于#pragma once方式来说,首先是需要code的代码很少,另外不需要自定义宏名称,避免了“撞车”的风险,但是#pragma once提供的保证仅仅是:同一个物理意义上的文件不会被包含多次。如果两个文件内容完全一样,则该方式仍然会重复包含。

结合以上分析,我个人倾向于使用#pragma once,因为需要code的代码更少,无需自想宏名称,另外,出现包含多个内容相同的文件的情况也很很少的(除非有意,否则不太可能出现这种情况)。