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之间放置包含,以便在需要时才包含它?当你不这样做时,它对系统有影响吗?
答案 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的三个读取。对于大型项目,包含大量其他文件的大量文件[特别是如果您订阅“在使用此文件之前不必包含其他文件”的原则],这可以加起来相当多的文件阅读。它不应该是你如何/在何处安排文件的主要选择,但记住一点点是一个好主意。
话虽如此,大多数预处理器都“聪明”,并且了解文件是否在第一次包含顶部和底部的防护装置时,下次不需要读取标头。
此外,不将文件包含在头文件中,除非实际需要这是一个非常好的主意 - 当然,同样适用于源文件。