什么是<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