+头文件,包括文件在定义块或只是在文件的顶部

+ header file, include files in define block or just on the top of the file

本文关键字:文件 顶部 定义 包括      更新时间:2023-10-16

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

我应该把include放在定义之间,以便它只在需要时被包含吗?如果不这样做,会对系统产生影响吗?

一般来说,系统头文件确实有防止错误的过度包含的保护,所以这并不重要。

#ifndef Foo_class
#define Foo_class

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

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

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

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

最好的地方是在顶部。

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

在这种情况下:-正如其他答案所指出的那样,两者在技术上没有区别。-我遇到的所有代码都把include守卫放在顶部。虽然有时他们会追版权声明,但警卫从来不会追其他#includes

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

然而,把它放在#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五次。如果我们移出include保护,这样当common.h被包含时,它就不包含其他文件,至少我们保存了对iostream的三次读取。对于一个大型项目,大量文件包含大量其他文件(特别是如果您遵循"在使用这个文件之前不应该包含其他文件"的原则),这可能会导致相当多的文件读取。它不应该是你安排文件的方式/位置的主要选择,但记住它是一个好主意。

话虽如此,大多数预处理器都是"聪明的",并且理解如果文件第一次在顶部和底部包含了守卫,那么下一次就不需要读取头文件了。

此外,除非确实需要,否则不要在头文件中包含文件,这是一个非常好的主意——当然,源文件也是如此。