我应该包含已经通过其他标头包含的标头吗?

时间:2010-10-15 20:30:40

标签: c++ header

我刚才注意到我使用字符串类编译的程序没有包含<string>标题。事实证明,<iostream>包含<ios_base>,而<string>又包含<string>

这是不好的做法,我应该明确包含<string>吗?即使只是一个清晰的例子呢?

假设这不仅仅适用于<string>标题,这是否安全?也许这是特定于实现的,或标准是否通过<ios_base><iostream>包含<string>标题?确保任何受到尊重和广泛使用的实施始终包括<iostream>提供对{{1}}的调用。

3 个答案:

答案 0 :(得分:10)

您应该明确包含您需要的任何标准库头。

未指定其他标准库标头包含哪些标准库标头,因此编译器之间的此类详细信息会有所不同。

依赖于另一个标头包含的标头的一种情况是,一个标头中的类派生自另一个标头中的类。例如,<iostream>必须包含<ios_base>,因为<iostream>中定义的类派生自<ios_base>中定义的类。

答案 1 :(得分:7)

一个好的做法是始终包含您将在给定源文件中使用的类的标题,无论您是否“知道”它们已包含在已包含的文件中。

如果在重构代码时,您删除了其中一个较高级别包含文件(例如iostream)的必要性,那么确定应用程序不再编译的原因可能会非常痛苦。

答案 2 :(得分:2)

如果你不止一次添加一个合适的标题(带有'#pragma once'或正确的#ifndef),它只会增加一点时间来编译(只是为了打开,解析和彻底删除头文件内容),但是,如果情况发生变化(即将它们移动到另一个项目,从中创建一个库等),它会使您的文件更容易编译 如果您真的关心编译时间,请在包含标题之前添加相同的#ifndef(虽然我不推荐它)

// header.h
#ifndef _HEADER_H
#define _HEADER_H
int blahblahblah(int);
#endif


// cppfile.cpp
#ifndef _HEADER_H
#include <header.h>
#endif