是多余的包括警卫有必要吗?
-
19-09-2019 - |
题
是 '多余包括卫士' 必要的CodeGear RAD Studio 2009的?是编译器足够聪明,它自己处理?
例如,我可能有以下“包括后卫” foo.h中:
#ifndef fooH
#define fooH
// ... declaration here
#endif
和下面的 '冗余包括防护件' 在use_foo.h:
#ifndef fooH
#include "foo.h"
#endif
此外,如果编译器是不够聪明,是'冗余包括警卫necesarry如果被包括他们在一个源文件。例如use_foo.cpp
。 ?
解决方案
在标记为“冗余包括防护件”的代码的部分是没有必要的,但它是一个可能优化。
在C ++生成器的情况下,存在以检测报头警卫逻辑,因此它不应该是必要的。
在一般情况下,预处理通通常是相当快无论如何,所以这是不可能的这个的优化会买你多少反正。
其他提示
这些冗余包括警卫用以模拟所提出的#pragma once
指令的功能:如果某些头文件已经被包括在内,那么预处理器甚至不会尝试定位,开放,再分析它(因为它必须与“普通”包括后卫技术)。在许多情况下,这使得包含文件更有效(加速编译)。
此方法显然是一种高维护一个:一个具有以确保防护码元的拼写是完全头文件内的相同以及外
。在“冗余包括防护件”,因为调用它,加快编译。
如果没有冗余后卫,编译器将迭代整个foo.h中文件,寻找一些代码,可能是#ifndef
块外。如果它是一个长的文件,这是做了很多的地方,编译器可能会浪费了很多时间。但是,随着多余的后卫,也可以跳过整个#include
声明,甚至没有重新打开该文件。
当然,你必须尝试和看到的时间由编译器通过了foo.h迭代浪费,实际上没有任何编制的实际金额;也许现代的编译器实际上看起来这种模式,并自动就不会去打扰打开文件的一切,我不知道。
(开始由280Z28编辑)
下面的报头结构是由至少 GCC和MSVC认可。使用这种模式实际上否定你可以用在包括文件卫士获得的所有利益。注意,当编译器检查的结构的评论被忽略。
// GCC will recognize this structure and not reopen the file
#ifndef SOMEHEADER_H_INCLUDED
#define SOMEHEADER_H_INCLUDED
// Visual C++ uses #pragma once to mark headers that shouldn't be reopened
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
// header text goes here.
#endif
(完编辑)