页眉应包含一次

Header should be included once

本文关键字:包含一      更新时间:2023-10-16

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

1.

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

2.

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

哪个更可取,为什么?

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

编译器通常会对第一个选项进行优化,使其表现得像非标准的#pragma once

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

我会选择第一个。

原因:如果您想更改保护名称(例如,SOME_CLASSSOMECLASS),您不必一直向下滚动到文件末尾也可以更改它。

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

我更喜欢第一个选项。假设您包含更多的文件,而这些文件又包含包含#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