是 '多余包括卫士' 必要的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

(完编辑)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top