在C/C++中,通过 #include 来将多个文件(通常是头文件)合并在一起(当然,对于特定的一个文件来说,#include 表示引入其它文件)。为了避免多次,重复的引入同一个文件,我们常采用的方法是使用 #ifndef。
#ifndef的优缺点
#ifndef 的使用方式一般为:
1 |
|
HEADER_FILE_H 通常为每个头文件的文件名。 这种方式有以下优点:
- 良好的兼容性。因为这是 C++ 的语法标准,因此不同的编译器都能很好的支持。
但该方式也有一些缺点:
- 保护文件不被重复引用的关键是 HEADER_FILE_H, 如果不小心在多个文件中定义了同一个宏,则有可能会出现明明 include 了,但去找不到的情况。
比如,我们定义了两个文件: mode1.h 和 mode2.h, 但在定义红的时候,两个文件都定义为 MODE_1_H, 这时候还有一个名为 product.h 的文件,引用了这两个头文件:
1 |
|
这个时候 mode2.h 中定义的各种程序要素就永远无法引入到 product.h 文件中。
- #ifndef 方法的第二个缺点是编译时间比较长,因为需要读文件中的宏才能判断是否已经引入了。
#pragma once 的优缺点
在一些编译器中,也支持 #pragma once 的宏,该宏有编译器提供保证,判断一个文件不会被引入多次。常见的用法:
1 |
|
这种方法的优点是:
- 不依赖于程序员自己定义的宏名,更安全,能避免 #ifndef 中出现的”冲突”问题。
- 编译速度更快。
当这种方法也有缺点, 突出的缺点就是兼容性不好,不是所有的编译器都能支持。