13

我总是把我#include的 放在#ifdef/ #defineInclude-Guard 之后。现在我的 IDE(Qt Creator)的重构机制把它放在 Include-Guard 之前,例如

#include "AnotherHeader.h"

#ifndef MYHEADER_H
#define MYHEADER_H

这会导致任何问题还是我可以这样离开它?

4

3 回答 3

10

如果有问题的标题本身包含警卫,您将不会遇到问题。将它放在包含守卫中仍然可以加快编译速度。编译器看不到的东西需要更少的时间来编译,即使它不会产生任何错误。

于 2014-01-08T06:48:12.707 回答
3

虽然不太常见,但我认为这被认为是可以接受的,但请注意:如果您有循环#include,您的包含通常会永远相互包含(直到预解析器抱怨达到最大包含深度)。#include包含守卫之后的 's不会发生这种情况。

(在任何情况下,Circular#include都不被认为是好的风格,但如果仍然使用它,它可能会在 include 保护之后#include与's一起使用,但肯定不会与它们之前的's一起使用。)#include

于 2015-02-18T12:06:54.423 回答
1

只需检查一下,会发生什么。让我们假设,两个不同的标题使用MyHeader.h.

  1. AnotherHeader.h无条件包含
  2. 包含守卫允许加载头文件的其余部分。

下一次:

  1. AnotherHeader.h再次无条件收录
  2. 包含保护防止加载头文件的其余部分。

如果AnotherHeader.h是包含保护的,则不会发生任何不好的事情。但一般来说,我会将 include-guard 放在文件的顶部 -AnotherHeader.h当它已经加载一次时,再次加载是没有意义的。

于 2014-01-08T06:49:38.730 回答