<iosfwd>标头是什么?


Answers:


71

因此,您可以在自己的标头中声明依赖iostream类型的声明的方法,而不必依赖#includeiostream标头本身,因为iostream标头本身比较大,复杂且编译缓慢。

这是一个简单的例子:

// foo.h
#include <iosfwd>

void sucker(std::iostream& is);

 

// foo.cc
#include <iostream>

void sucker(std::iostream& is) {
    is >> somevar;
}

您能否详细解释它如何转发参考?
wp2

2
@ wp2:它只是声明类型而不定义它们。为什么不自己看看里面呢?很小
Marcelo Cantos

1
#include <iostream>而不是直接在foo.h中执行,在foo.cc中有什么好处?
wp2 2010年

11
@ wp2:是的,但是仅在需要声明的.cpp文件中,而不是在每个使用foo.h的.cpp文件中。
Marcelo Cantos

iosfwd除了名称空间std {类istream; cass ostream; }?
zzz777 '17

39

正如@Marcelo Cantos所提到的,因此您可以包括iostream类和函数的声明,而不包括完整的定义。在C和C ++中,声明是一条声明,声明为“这里是某物(一个函数/类/等)的名称,但是除了其名称之外,我不会再告诉您任何其他信息”。对于函数,这意味着函数的名称,而不是包含函数代码的主体。对于一个类,这意味着该类的名称,但不是该类的任何成员变量或方法。

相反,定义是完整的定义:函数主体,类成员等。

通常,您只需要声明要使用的东西即可-对于函数来说,您不需要知道函数的主体是什么样子就可以调用它(模板或内联函数除外)。同样,对于类,如果您要做的只是传递指向该类实例的指针或引用,则无需知道该类具有哪些成员。但是,一旦您需要访问成员变量或调用类方法,就需要完整的定义。

通过仅包括声明而不是定义,编译器必须处理的代码总量要少得多,因此编译将更快地进行。

为了让您大致了解正在处理的代码量,以下是本地实现中包含的代码量:

# The following commands create a source file that includes a single header
# file (on stdout), preprocess it with g++ -E, and then count how many lines
# are in the resulting preprocessed output
$ echo '#include <iosfwd>' | g++ -E -xc++ - | wc
    2598    6534   57875
$ echo '#include <iostream>' | g++ -E -xc++ - | wc
   25631   59613  631998

包含的文件,<iosfwd>编译器必须处理来自各种头文件的2598行代码,而包含的文件<iostream>必须处理高达25631行的代码。那是在源代码中编译您关心的实际代码之前!


以下命令如何工作,$ echo'#include <iosfwd>'| g ++ -E -xc ++-| 我尝试运行以下命令,但显示某些错误$ echo'#include <QtGlobal>'| g ++ -E -xc ++-| wc我哪里错了?
beparas

14

基本上,使用时<iosfwd>是因为要消除编译时依赖性。

您可以使用<iosfwd>而不是传统的流头(<iostream>和friends)来避免包括整个流媒体内容的定义。与<iosfwd>您只对所有流媒体内容进行前向声明。

我发现此链接特别有用:http : //www.gotw.ca/gotw/007.htm


3
与已经存在并且已有2年以上历史的两个答案相比,这种方法更具有洞察力。
Christian Rau

我给人的印象是,这更多是一种构建优化:与<iosfwd>相比,编译所需的时间要少得多<iostream>。还是该应用程序是您所说的主旨?

@ChristianRau,为帮助您和Google员工提供答案:对于其中一个(显然至少还有十二个),我确实很感谢这个简短的用法。我不需要其他任何东西,只需要神奇的词“转发声明”(您可能会错过了),就可以在此页面上其他任何地方出现(除了此答案之后添加的问题标签)。
Sz。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.