2010-11-29 38 views

回答

43

這樣您就可以在自己的頭文件中聲明依賴於iostream類型聲明的方法,而無需使用iostream頭文件本身,這些頭文件很大,很複雜,編譯速度也很慢。

這裏有一個簡單的例子:

// foo.h 
#include <iosfwd> 

void sucker(std::iostream& is); 

 

// foo.cc 
#include <iostream> 

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

能詳細解釋它是如何轉發引用? – wp2 2010-11-29 03:57:32

+0

@ wp2:它只聲明類型而不定義它們。爲什麼不自己偷看呢?它很小。 – 2010-11-29 03:58:55

+0

在foo.cc中`#include `有什麼好處,而不是直接在foo.h中做? – wp2 2010-11-29 07:46:41

27

如前所述@Marcelo Cantos,它是如此,你可以包括iostream類和函數的聲明不包括完整的定義。在C和C++中,一個聲明是一個聲明,「這裏是某個東西的名字(一個函數/類/等),但除了它的名字,我不會告訴你任何關於它的更多信息。對於函數,這意味着函數的名稱,但不包含函數的代碼。對於一個類,這意味着類的名稱,但不是任何類的成員變量或方法。

相反,定義是完整的定義:函數體,類成員等

通常情況下,你只需要一些報關使用,在功能的情況下,你不」 t需要知道函數的主體是什麼樣的(除了模板函數或內聯函數)。同樣,對於一個類,如果你正在做的是傳遞指針或引用該類的實例,則不需要知道該類有哪些成員。但只要您需要訪問成員變量或調用類方法,您就需要完整的定義。

通過僅包含聲明而不是定義,編譯器必須處理的代碼總量遠遠更少,因此編譯將更快地進行。

爲了讓你被多少碼處理的想法,這裏有多少代碼包含在我的本地執行:

# 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行代碼。這是在編譯你在源文件中關心的實際代碼之前!

8

基本上當你使用<iosfwd>是因爲你想消除編譯時的依賴關係。

您使用<iosfwd>而不是傳統的流標頭(<iostream>和朋友),這樣就可以避免包含整個流式內容的定義。與<iosfwd>你只是做出所有流媒體的前瞻性聲明。

我發現這個鏈接有用格外: http://www.gotw.ca/gotw/007.htm