什么是<iosfwd>标题?

这个文件中提到的<iosfwd>头是什么?

为什么有必要?

任何例子?

这样你就可以在自己的头文件中声明依赖于iostreamtypes声明的方法,而不需要包含iostream头文件本身,这些头文件很大,很复杂,编译速度也很慢。

这是一个简单的例子:

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

正如@Marcelo Cantos所提到的那样,你可以在不包含完整定义的情况下包含iostream类和函数的声明。 在C和C ++中, 声明是一个声明:“这里是某个东西的名字(一个函数/类/等),但除了它的名字,我不会再告诉你任何关于它的东西。 对于函数来说,这意味着函数的名字,而不是包含函数代码的主体。 对于一个类,这意味着类的名称,而不是任何类的成员variables或方法。

相反, 定义是完整的定义:function主体,class级成员等

通常情况下,你只需要声明一些东西来使用 – 在函数的情况下,你不需要知道函数的正文是如何调用的(除了模板函数或内联函数)。 同样,对于一个类,如果你所做的只是传递指针或引用该类的实例,则不需要知道该类是什么成员。 但只要你需要访问一个成员variables或调用一个类方法,那么你确实需要完整的定义。

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

为了让您知道正在处理多less代码,下面是我的本地实现中包含多less代码:

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

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

您可以使用<iosfwd>而不是传统的stream标头( <iostream>和朋友),这样就可以避免包含整个stream媒体的定义。 有了<iosfwd>你只能对所有stream媒体进行前向声明。

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