【问题标题】:What is the <iosfwd> header?<iosfwd> 标头是什么?
【发布时间】:2011-05-17 02:05:57
【问题描述】:

&lt;iosfwd&gt; header 是做什么用的?为什么有必要?

有什么例子吗?

【问题讨论】:

    标签: c++ iostream forward-declaration iosfwd


    【解决方案1】:

    这样您就可以在自己的标头中声明依赖于 iostream 类型声明的方法,而无需 #include iostream 标头本身,因为这些标头庞大、复杂且编译速度慢。

    这是一个简单的例子:

    // foo.h
    #include <iosfwd>
    
    void sucker(std::iostream& is);
    

     

    // foo.cc
    #include <iostream>
    
    void sucker(std::iostream& is) {
        is >> somevar;
    }
    

    【讨论】:

    • 你能详细解释一下它是如何转发引用的吗?
    • @wp2:它只是声明类型而不定义它们。为什么不自己去看看呢?它很小。
    • #include &lt;iostream&gt; 在 foo.cc 中而不是直接在 foo.h 中这样做有什么好处?
    • @wp2:是的,但只在需要声明的 .cpp 文件中,而不是在每个使用 foo.h 的单个 .cpp 文件中。
    • 除了命名空间 std { class istream; 之外,iosfwd 有什么吗? cass ostream; } ?
    【解决方案2】:

    正如@Marcelo Cantos 提到的那样,您可以在不包括完整定义的情况下包含 iostream 类和函数的声明。在 C 和 C++ 中,declaration 是一个声明“这里是某事物的名称(函数/类/等),但除此之外我不会告诉你更多关于它的信息其名称”。对于函数,这意味着函数的名称,而不是包含函数代码的主体。对于一个类,这意味着类的名称,而不是类的任何成员变量或方法。

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

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

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

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

    # 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
    

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

    【讨论】:

    • 以下命令如何工作,$ echo '#include ' | g++ -E -xc++ - | wc 我尝试运行以下命令,但它显示一些错误 $ echo '#include ' | g++ -E -xc++ - | wc 我哪里错了?
    【解决方案3】:

    基本上当你使用&lt;iosfwd&gt; 是因为你想消除编译时依赖。

    您使用&lt;iosfwd&gt; 而不是传统的流标头(&lt;iostream&gt; 和朋友),这样您就可以避免包含整个流媒体内容的定义。使用&lt;iosfwd&gt;,您只是对所有流媒体内容进行了前向声明。

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

    【讨论】:

    • 这在哪方面比两个已经存在且超过 2 年的答案更有洞察力。
    • 我的印象是这更像是一种构建优化:编译&lt;iosfwd&gt;&lt;iostream&gt; 花费的时间要少得多。还是您所说的那个应用程序的主旨?
    • @ChristianRau,为了帮助您和谷歌员工找到答案:对于一个(显然至少有十几个其他人)我真的很欣赏这个简洁性。我不需要其他人的任何花言巧语,只需要神奇的词 “前向声明”,您可能错过了,它在此页面上的其他任何地方都没有出现(除了问题标签这个答案之后添加)。
    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2013-12-25
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多