什么是<iosfwd>标题?

wp2*_*wp2 59 c++ iostream forward-declaration iosfwd

<iosfwd>标题用于什么(在此文件中提到)?

为什么有必要?

任何例子?

Mar*_*tos 59

这样你就可以在你自己的头文件中声明依赖于iostream类型声明的方法,而不必#include使用iostream头文件,这些头文件很大,很复杂,编译速度很慢.

这是一个简单的例子:

// foo.h
#include <iosfwd>

void sucker(std::iostream& is);
Run Code Online (Sandbox Code Playgroud)

 

// foo.cc
#include <iostream>

void sucker(std::iostream& is) {
    is >> somevar;
}
Run Code Online (Sandbox Code Playgroud)

  • @ wp2:看了答案,这只是一句话. (11认同)
  • @ wp2:是的,但只在需要声明的.cpp文件中,而不是在每个使用foo.h的.cpp文件中. (8认同)
  • @wp2:它只是声明类型而不定义它们。为什么不自己看看里面呢?它很小。 (2认同)

Ada*_*eld 36

正如@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
Run Code Online (Sandbox Code Playgroud)

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


Les*_*ire 11

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

您使用<iosfwd>而不是传统的流标题(<iostream>和朋友),以便您可以避免包括整个流媒体内容的定义.随着<iosfwd>你只是做的所有的东西流的正向声明.

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

  • 这比现有的两个以及两年多的答案更具洞察力. (2认同)
  • @ChristianRau,为了帮助您和谷歌用户找到答案:对于一个(显然是至少十几个其他人)来说,我真的很欣赏这个的简洁性。我不需要其他人的任何废话,只需要神奇的词“前向声明”,正如您可能错过的那样,它出现在本页的其他地方(除了在这个答案之后添加的问题标签) 。 (2认同)