标题应包含一次

时间:2011-05-25 11:13:50

标签: c++ header-files

在头文件中,我看到了两种主要的方法来定义宏以避免不止一次包含该文件。

1

#ifndef SOME_CLASS
#define SOME_CLASS
//code ...
#endif

2

#ifndef SOME_CLASS
//code...
#define SOME_CLASS
#endif

哪个更为可取,为什么?

5 个答案:

答案 0 :(得分:11)

我更喜欢第一种方法,因为在ifndef之后会发生什么并不重要,因为它会在之后直接定义。

答案 1 :(得分:4)

第一个选项通常由编译器优化,表现得像非标准#pragma once

在递归包含的情况下也更安全。如果在//code...部分中包含另一个包含....的标题,其中包含您当前正在编辑的标题,那么第二个版本将无效。

答案 2 :(得分:2)

我会选择第一个。

原因:如果您想要更改防护名称(例如,SOME_CLASSSOMECLASS),则无需一直向下滚动到文件末尾以进行更改

答案 3 :(得分:1)

最好的选择是使用#pragma once。使用#define时,使用多个库时必须非常小心,因为防护名称可能不是唯一的。

答案 4 :(得分:0)

我更喜欢第一种选择。假设您包含更多文件,这些文件又包含包含#ifndef SOME_CLASS的文件。

如果#define SOME_CLASS#ifndef SOME_CLASS不相邻,我认为发现包含错误相当容易。

// SomeClass.h
#ifndef SOME_CLASS
#include "OtherFile.h" // will eventually lead to #include "SomeClass.h"
#define SOME_CLASS

... boat load of code here...

#endif // SOME_CLASS