+头文件,包括定义块中的文件或仅位于文件顶部的文件 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*/

+头文件,包括定义块中的文件或仅位于文件顶部的文件 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*/,c++,C++,我是否应该将include放在define之间,以便只在需要时才包含它?如果不这样做,是否会对系统产生影响?库头文件已包含其自己的ifdef,因此如果包含在多个文件中,则所有问题都会得到解决。所以你把它放在哪里并不重要。库头文件已经包含了它们自己的ifdef,所以如果包含在多个文件中,所有问题都会得到解决。所以你把它放在哪里并不重要 #ifndef Foo_class #define Foo_class 这一对应该始终是任何.h文件的第一对行 如果您包含其他包含保护的.h文件或库文件,这可能不

我是否应该将include放在define之间,以便只在需要时才包含它?如果不这样做,是否会对系统产生影响?

库头文件已包含其自己的ifdef,因此如果包含在多个文件中,则所有问题都会得到解决。所以你把它放在哪里并不重要。

库头文件已经包含了它们自己的ifdef,所以如果包含在多个文件中,所有问题都会得到解决。所以你把它放在哪里并不重要

#ifndef Foo_class
#define Foo_class
这一对应该始终是任何.h文件的第一对行

如果您包含其他包含保护的.h文件或库文件,这可能不重要,但这是一个好习惯

另一个好习惯,避免使用std名称空间;在标题中

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

如果您包含其他包含保护的.h文件或库文件,这可能不重要,但这是一个好习惯


另一个好习惯,避免使用std名称空间;在头文件中。

通常,系统头文件具有防止错误的过度包含的保护,因此这并不重要。

通常,系统头文件具有防止错误的过度包含的保护,因此这并不重要。

最好的位置是在顶部

只有在有技术原因的情况下才能做与其他人不同的事情

在这种情况下: -正如其他答案所指出的那样,两者之间没有技术上的区别。 -我遇到的所有代码都将include卫士放在顶部。虽然有时他们是在版权声明之后,但卫兵从不在其他内容之后


因此:把它放在最上面。

最好的地方是在最上面

只有在有技术原因的情况下才能做与其他人不同的事情

在这种情况下: -正如其他答案所指出的那样,两者之间没有技术上的区别。 -我遇到的所有代码都将include卫士放在顶部。虽然有时他们是在版权声明之后,但卫兵从不在其他内容之后


因此:把它放在最上面。

在大多数情况下,只要内部包含的文件有include-guard,它就没有真正的区别。把它放在你认为最有意义的地方

但是,将其放在ifndef保护中的惯例有一个原因,即当文件需要长时间加载时(例如,在大型项目中,文件位于重载网络驱动器或低速磁盘上),同一头文件可能会多次包含在同一项目中

假设我们有一个共同点。h:

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

#ifndef COMMON_H
#define COMMON_H

... stuff goes here ...

#endif
大体上,我们有

#include <iostream>
#incldue "common.h"
#include "myheader1.h"
#include "myheader2.h"
#include "myheader3.h"
其中myheader{1,2,3}.h也包括common.h

从理论上讲,预处理器必须读取所有common.h四次,iostream五次。如果我们将include保护移出,这样当包含common.h时,它就不包含其他文件,至少我们保存了iostream的三次读取。对于一个大型项目,有大量的文件,其中包含大量的其他文件(特别是如果您同意在使用此文件之前不必包含其他文件的原则),这会增加相当多的文件读取量。它不应该是您排列文件的方式/位置的主要选择,但记住一点是一个好主意

话虽如此,大多数预处理器都很聪明,并且知道如果第一次文件的顶部和底部都有防护装置,那么下次就不需要读取头了


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

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

但是,将其放在ifndef保护中的惯例有一个原因,即当文件需要长时间加载时(例如,在大型项目中,文件位于重载网络驱动器或低速磁盘上),同一头文件可能会多次包含在同一项目中

假设我们有一个共同点。h:

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

#ifndef COMMON_H
#define COMMON_H

... stuff goes here ...

#endif
大体上,我们有

#include <iostream>
#incldue "common.h"
#include "myheader1.h"
#include "myheader2.h"
#include "myheader3.h"
其中myheader{1,2,3}.h也包括common.h

从理论上讲,预处理器必须读取所有common.h四次,iostream五次。如果我们将include保护移出,这样当包含common.h时,它就不包含其他文件,至少我们保存了iostream的三次读取。对于一个大型项目,有大量的文件,其中包含大量的其他文件(特别是如果您同意在使用此文件之前不必包含其他文件的原则),这会增加相当多的文件读取量。它不应该是你安排文件的方式/地点的主要选择,但要记住一个l 一点点是个好主意

话虽如此,大多数预处理器都很聪明,并且知道如果第一次文件的顶部和底部都有防护装置,那么下次就不需要读取头了


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

不一定。这只是一个惯例,在这种情况下,它没有实际区别。也不是每个头都封装一个类。这只是一个惯例,在这种情况下,它没有实际区别。也不是每个头都封装了一个类。谢谢,所以没有性能损失或任何东西。但在我看来,从ifndef开始似乎是一种很好的做法,当您包含两个彼此需要的头时,这可能会导致一个include循环。或者从ifndef开始也有缺点吗?@Dagob我通常把所有东西都放在ifdef中,因为1。如果一个标题不小心没有包含防护装置,这会捕获它,2。预处理器不会多余地工作。谢谢,这样就不会损失性能或其他任何东西。但在我看来,从ifndef开始似乎是一种很好的做法,当您包含两个彼此需要的头时,这可能会导致一个include循环。或者从ifndef开始也有缺点吗?@Dagob我通常把所有东西都放在ifdef中,因为1。如果一个标题不小心没有包含防护装置,这会捕获它,2。预处理器不会多余地工作。您在那里做的唯一不好的事情就是使用namespace std;。永远不要在标题中这样做,很少在标题之外这样做。你在标题中做的唯一不好的事情就是使用namespace std;。永远不要在标题中这样做,很少在标题之外这样做。