在头文件中,我看到了两种主要的方法来定义宏以避免不止一次包含该文件。
1
#ifndef SOME_CLASS
#define SOME_CLASS
//code ...
#endif
2
#ifndef SOME_CLASS
//code...
#define SOME_CLASS
#endif
哪个更为可取,为什么?
答案 0 :(得分:11)
我更喜欢第一种方法,因为在ifndef之后会发生什么并不重要,因为它会在之后直接定义。
答案 1 :(得分:4)
第一个选项通常由编译器优化,表现得像非标准#pragma once
。
在递归包含的情况下也更安全。如果在//code...
部分中包含另一个包含....的标题,其中包含您当前正在编辑的标题,那么第二个版本将无效。
答案 2 :(得分:2)
我会选择第一个。
原因:如果您想要更改防护名称(例如,SOME_CLASS
至SOMECLASS
),则无需一直向下滚动到文件末尾以进行更改
答案 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