如果目标文件已经具有标头保护,我们是否应该用 #ifndef 来保护 #include
Should we guard #include with #ifndef if the targeted file already has header guard?
假设我们有两个类,Foo和Bar。
在福赫
#ifndef MYPROJ_FOO
#define MYPROJ_FOO
....
# endif
在 Bar.cpp 中,我们是否还需要保护包含,例如
#ifndef MYPROJ_FOO
#include <Foo.h>
#endif
还是简单的#include
就足够了?如果我们已经有头球后卫,那么包括后卫对我来说似乎是多余的,但我经常看到这种做法,因此想知道我是否错过了什么。谢谢!
从功能上讲,它没有任何区别。
旧代码可能使用它的一个原因是作为优化。这意味着预处理器可以避免第二次读取Foo.h
,因此它可以更快地生成结果。
如今,即使预处理器确实第二次读取文件,其性能影响也应该足够小,不会打扰它。一些预处理器甚至可以自动检测标头保护,记住哪个标头保护与哪个宏相关联,并避免自行重新读取标头文件。
不,你不应该。 包含保护用于标头,这些标头包含在其他文件中。另一方面,源文件不应包含在其他文件中。
或者,您可以考虑在头文件中使用(非标准但普遍接受的)扩展名
#pragma once
在 Bar.cpp 中,我们是否还需要保护包含,例如
#ifndef MYPROJ_FOO #include <Foo.h> #endif
还是简单的
#include
就足够了?
从正确性的角度来看,简单的#include
就足够了。
如果我们已经有头球后卫,那么包括后卫对我来说似乎是多余的,但我经常看到这种做法,因此想知道我是否错过了什么。
这种做法是由John Lakos在他的《大规模C++软件设计》一书中推荐的。
但是,更好的替代方法是使用 #pragma once
指令,大多数现代C++编译器都支持该指令。
噗
:#pragma once
....
然后,您可以使用
#include "Foo.h"
在任何.cpp文件中。
还是简单的
#include
就足够了?
是的,它是。
是如果我们已经有头球后卫,那么包括后卫对我来说似乎是多余的,
的,这完全是多余的。
但我经常看到这种做法
我没有看到这样的做法,除非代码作者不知道他们在做什么。
相关文章:
- lock_guard是否保护返回值
- 公共/私有/受保护是否会更改内存中结构的排列?
- 检查nullptr是否100%保护内存布局不受segfault影响
- c++ 编译器是否保护常量内存地址免受任何更改?
- 我们是否应该转向新的自我分配保护方式?
- STL 是否为其标头指定标头保护?
- 在 C++17 中,是否未定义使用无锁原子学保护从信号处理程序传递的数据?
- 如何在Windows上检查EXE是否具有/GS安全保护
- 如何检查 ACL 是否受到保护
- 是否可以基于私有/受保护成员分配类枚举?
- 是否可以解密受 cenc 保护的 MPEG-DASH 文件?
- 锁定的互斥锁是否保护condition_variable和数据?
- Windows 10 是否保护您不访问其他程序正在使用的内存?
- 如何检查是否定义了标头保护
- C++ 我是否需要为嵌套类定义标头保护
- 是否可以使用 static_cast 颠覆受保护成员访问检查?
- 如果目标文件已经具有标头保护,我们是否应该用 #ifndef 来保护 #include
- Boost单元测试夹具继承测试类,是否可以访问受保护的方法
- 我是否需要通过锁来保护对 Boost MultiIndex 索引(索引本身)的访问?
- C++是否可以从同级第二个派生对象访问第一个派生对象的受保护基础数据成员?