1

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*/

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

4

5 回答 5

3
#ifndef Foo_class
#define Foo_class

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

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

另一个好习惯,避免using namespace std;出现在标题中。

于 2013-01-13T16:02:10.433 回答
3

通常,系统头文件确实可以防止错误的过度包含,所以这并不重要。

于 2013-01-13T16:02:36.800 回答
2

库头文件已经包含他们自己#ifdef的,所以如果包含在多个文件中,一切都会得到解决。所以不管你把它放在哪里。

于 2013-01-13T16:01:47.677 回答
1

最好的地方是在顶部。

仅在有技术原因时才做与其他人不同的事情。

在这种情况下: - 正如其他答案所指出的那样,两者之间没有技术差异。- 我遇到的所有代码都将包含守卫放在顶部。虽然有时他们在版权声明之后,但守卫从不关注其他人#includes

因此:把它放在顶部。

于 2013-01-13T16:13:43.207 回答
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 4 次,以及 iostream 5 次。如果我们把 include 守卫移出去,这样当 common.h 被包含时,就不会包含其他文件了,至少我们保存了 iostream 的三个读取。对于一个大型项目,包含大量其他文件的大量文件[特别是如果您遵守“在使用此文件之前不必包含其他文件”的原则],这可以加起来相当多的文件阅读。它不应该是您安排文件的方式/位置的主要选择,但记住一点是个好主意。

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

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

于 2013-01-13T16:22:07.347 回答