C++ 什么是<;iosfwd>;头球?

C++ 什么是<;iosfwd>;头球?,c++,iostream,forward-declaration,iosfwd,C++,Iostream,Forward Declaration,Iosfwd,这是用来干什么的?为什么有必要 有什么例子吗?这样,您就可以在自己的头中声明依赖于iostream类型声明的方法,而不必#包括iostream头本身,这些头很大、复杂且编译速度慢 下面是一个简单的例子: // foo.h #include <iosfwd> void sucker(std::iostream& is); //foo.h #包括 真空吸盘(标准::iostream&is); //foo.cc #包括 真空吸盘(标准::iostream&is){ is>>

这是用来干什么的?为什么有必要


有什么例子吗?

这样,您就可以在自己的头中声明依赖于iostream类型声明的方法,而不必
#包括
iostream头本身,这些头很大、复杂且编译速度慢

下面是一个简单的例子:

// foo.h
#include <iosfwd>

void sucker(std::iostream& is);
//foo.h
#包括
真空吸盘(标准::iostream&is);

//foo.cc
#包括
真空吸盘(标准::iostream&is){
is>>somevar;
}
如前所述,这样您就可以在不包含完整定义的情况下包含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
#以下命令创建包含单个头的源文件
#文件(在stdout上),使用g++-E对其进行预处理,然后计算有多少行
#在结果的预处理输出中
$echo'#include'| g++-E-xc++-wc
2598    6534   57875
$echo'#include'| g++-E-xc++-wc
25631   59613  631998

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

使用
基本上是因为要消除编译时依赖关系

您使用
而不是传统的流标题(
和friends),这样可以避免包含整个流内容的定义。使用
您只需对所有流媒体内容进行转发声明

我发现这个链接特别有用:

你能详细解释一下它是如何转发引用的吗?@wp2:它只是声明了类型而没有定义它们。为什么不亲自看一眼呢?它非常小。在foo.cc中包含
#而不是直接在foo.h中执行它有什么好处?@wp2:是的,但只在需要声明的.cpp文件中,而不是在每个使用foo.h的.cpp文件中。iosfwd除了名称空间std之外还有什么吗{class istream;cass ostream;}?在哪一方面,这比两个已经存在的和2年多的答案更具洞察力。我的印象是,这更像是一个构建优化:编译
花费的时间要少得多。或者,这个应用程序是你所说的主旨吗?@ChristianRau,帮你和谷歌的回答:对于其中一个(显然至少有十几个)来说,我真的很欣赏这个应用程序的简洁。我不需要任何其他的东西,只需要一个神奇的单词“转发声明”,你可能没有注意到,这个单词出现在本页的其他地方(除了在回答之后添加的问号)。下面的命令是如何工作的,$echo'#include'|g++-E-xc++-| wc我试图运行以下命令,但它显示了一些错误$echo'#include'|g++-E-xc++-| wc我错在哪里?
# 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