什么是<iosfwd>标题?</iosfwd>

时间:2010-11-29 03:47:43

标签: c++ iostream forward-declaration

<iosfwd> header用于什么?为什么有必要?

任何一个例子?

3 个答案:

答案 0 :(得分:56)

这样你就可以在自己的头文件中声明依赖于iostream类型声明的方法,而不需要#include iostream标题本身,这些标题很大,复杂且编译速度慢。

这是一个简单的例子:

// foo.h
#include <iosfwd>

void sucker(std::iostream& is);

// foo.cc
#include <iostream>

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

答案 1 :(得分:34)

正如@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行的代码。那是在编译你在源文件中关心的实际代码之前!

答案 2 :(得分:11)

基本上当你使用<iosfwd>时,是因为你想要消除编译时的依赖关系。

您使用<iosfwd>代替传统的流标头(<iostream>和朋友),这样您就可以避免包含整个流媒体内容的定义。使用<iosfwd>,您只是向所有流媒体内容做出前瞻声明。

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