我刚才注意到我使用字符串类编译的程序没有包含<string>
标题。事实证明,<iostream>
包含<ios_base>
,而<string>
又包含<string>
。
这是不好的做法,我应该明确包含<string>
吗?即使只是一个清晰的例子呢?
假设这不仅仅适用于<string>
标题,这是否安全?也许这是特定于实现的,或标准是否通过<ios_base>
和<iostream>
包含<string>
标题?确保任何受到尊重和广泛使用的实施始终包括<iostream>
提供对{{1}}的调用。
答案 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