+头文件,包含在定义块中的文件或仅在文件的顶部

时间:2013-01-13 16:00:15

标签: c++

C ++中包含文件的最佳位置是什么?例如:

/*Foo.h*/
#include <string>       //Should I place this between the #ifndef #endif?
#include "FooBar.h"
using namespace std;

#ifndef Foo_class
#define Foo_class
class Foo
{   
    /*XXX*/
}
#endif

/*FooBar.h*/
#ifndef FooBar_class
#define FooBar_class
class FooBar
{   
    /*XXX*/
}
#endif

/*Foo.cpp*/
#include "Foo.h"
/*XXX*/

/*FooBar.cpp*/
#include "FooBar.h"
/*XXX*/

我是否应该在define之间放置包含,以便在需要时才包含它?当你不这样做时,它对系统有影响吗?

5 个答案:

答案 0 :(得分:3)

#ifndef Foo_class
#define Foo_class

此对应始终是任何.h文件的第一对行。

如果您要包含其他.h文件或包含防护的库文件,则可能无关紧要,但仍然是一个好习惯。

另一个好习惯,避免在标题中使用using namespace std;

答案 1 :(得分:3)

通常情况下,系统头文件可以防止错误的过度包含,,所以这无关紧要。

答案 2 :(得分:2)

库头文件已包含自己的#ifdef,因此如果包含在多个文件中,所有内容都将被解析。所以你把它放在哪里都没关系。

答案 3 :(得分:1)

最好的位置在顶部。

如果有技术原因,只能做与其他人不同的事情。

在这种情况下:   - 其他答案指出,两者之间没有技术差异。   - 我遇到的所有代码都将包含警戒放在顶部。虽然有时它们是在版权声明之后,但是警卫永远不会在其他#includes之后。

因此:把它放在顶部。

答案 4 :(得分:1)

在大多数情况下,只要内部包含的文件包含防护,它就没有什么区别。把它放在你认为最有意义的地方!

但是,有一个理由将其放在#ifndef GUARD内,也就是说,当文件需要很长时间加载时(例如,它们位于负载很重的网络驱动器上,或者放在慢速磁盘上) ,在一个大型项目中,同一个头文件可能会在同一个项目中多次包含

假设我们有一个“common.h”:

#include <iostream>
#include "lesser_common.h"
#include "not_so_common.h"

#ifndef COMMON_H
#define COMMON_H

... stuff goes here ...

#endif

在main.c中,我们有

#include <iostream>
#incldue "common.h"
#include "myheader1.h"
#include "myheader2.h"
#include "myheader3.h"

myheader {1,2,3} .h也包括common.h。

现在理论上,预处理器必须读取所有common.h四次,并iostream 5次。如果我们将include guard移出,那么当包含common.h时,它不包含其他文件,至少我们保存了iostream的三个读取。对于大型项目,包含大量其他文件的大量文件[特别是如果您订阅“在使用此文件之前不必包含其他文件”的原则],这可以加起来相当多的文件阅读。它不应该是你如何/在何处安排文件的主要选择,但记住一点点是一个好主意。

话虽如此,大多数预处理器都“聪明”,并且了解文件是否在第一次包含顶部和底部的防护装置时,下次不需要读取标头。

此外,不将文件包含在头文件中,除非实际需要这是一个非常好的主意 - 当然,同样适用于源文件。