C++标题保护对象和用法?

Cha*_*fus 5 c++ include-guards

我习惯在我的对象周围放置标题守卫,如:

#ifndef SOMETHING_H
#define SOMETHING_H

class Something {
...
}
#endif
Run Code Online (Sandbox Code Playgroud)

但我也得到了他们也做的代码:

#ifndef SOMETHING_H
#include "something.h"
#endif
Run Code Online (Sandbox Code Playgroud)

对于每个包括.据说,这更好.为什么?围绕物体的守卫是多余的吗?

Pra*_*ian 5

它背后的想法是预处理器不需要打开头文件并读取内容以确定先前已包含该头,从而节省了编译期间的一些时间.但是,如今大多数编译器已经足够聪明,可以发现同一文件的多个包含并忽略后续出现的情况.

  • @AlexandreTryHardLeblanc:我认为他所获得的优势在于它可以在读取任何代码之前节省物理打开头文件的时间. (2认同)
  • 它似乎只会在不使用智能编译器的情况下加起来,并且只在包含许多重复标题的大型项目中才会加起来 (2认同)

And*_*ark 5

这里有相当详细的讨论:http:
//c2.com/cgi/wiki?RedundantIncludeGuards

以下是亮点:

  • 是的,这是多余的,但对于某些编译器,它可能更快,因为编译器将避免打开头文件,如果它不需要.
  • "好的编译器不需要这个习惯用法.他们注意到标题是使用include-guard惯用语(也就是说,文件中的所有非注释代码都用#ifndef括起来.)它们存储了一个头文件的内部表并保护在打开任何文件之前,他们检查防护的当前值,然后跳过整个文件."
  • "冗余防护装置有几个缺点.它们使得包含部分更难以阅读.它们是多余的.它们泄漏了防护名称,这应该是标题的秘密实施细节.例如,如果有人重新命名后卫他们可能会忘记更新所有假设保护名称的地方.最后,如果有人在守卫之外添加代码,则会出错.当然,它们只是编译时的效率黑客.只有当其他所有方法都失败时才使用."