+头文件,包括文件在定义块或只是在文件的顶部
+ header file, include files in define block or just on the top of the file
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的三次读取。对于一个大型项目,大量文件包含大量其他文件(特别是如果您遵循"在使用这个文件之前不应该包含其他文件"的原则),这可能会导致相当多的文件读取。它不应该是你安排文件的方式/位置的主要选择,但记住它是一个好主意。
话虽如此,大多数预处理器都是"聪明的",并且理解如果文件第一次在顶部和底部包含了守卫,那么下一次就不需要读取头文件了。
此外,除非确实需要,否则不要在头文件中包含文件,这是一个非常好的主意——当然,源文件也是如此。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 如何使用在头文件的后半部分声明的类,该类来自顶部的另一个类
- 为什么在头文件顶部包含指令
- 强制将符号置于 ELF 文件的顶部
- 如何使用SetFilePointer重定向到.csv文件的顶部
- 如何在tinyxml生成的xml文件的顶部添加DOCTYPE
- +头文件,包括文件在定义块或只是在文件的顶部