假设我们有两个类,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
就足够了?
是的,它是。
是如果我们已经有头球后卫,那么包括后卫对我来说似乎是多余的,
的,这完全是多余的。
但我经常看到这种做法
我没有看到这样的做法,除非代码作者不知道他们在做什么。