如果目标文件已经具有标头保护,我们是否应该用 #ifndef 来保护 #include

Should we guard #include with #ifndef if the targeted file already has header guard?

本文关键字:保护 是否 我们 #include #ifndef 如果 文件 目标      更新时间:2023-10-16

假设我们有两个类,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就足够了?

是的,它是。

如果我们已经有头球后卫,那么包括后卫对我来说似乎是多余的,

的,这完全是多余的。

但我经常看到这种做法

我没有看到这样的做法,除非代码作者不知道他们在做什么。