45
A
回答
43
這樣您就可以在自己的頭文件中聲明依賴於iostream類型聲明的方法,而無需使用iostream頭文件本身,這些頭文件很大,很複雜,編譯速度也很慢。
這裏有一個簡單的例子:
// foo.h
#include <iosfwd>
void sucker(std::iostream& is);
// foo.cc
#include <iostream>
void sucker(std::iostream& is) {
is >> somevar;
}
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
相關問題
- 1. 是什麼區別<%:項目[ 「標題」]%>和<%=項[ 「標題」]%>
- 2. 什麼是<NS0:什麼?
- 3. <comment>標記是什麼?
- 4. 什麼是<#= #>
- 5. 什麼是<%= ... %>
- 6. HTML - 什麼是<page>標籤在做什麼?
- 7. 什麼是PHP中的「<<< SQL」?
- 8. Php <<<是什麼意思?
- 9. 什麼是Swift上的+++和<<<?
- 10. 爲什麼XML端點將標記放在<而不是<
- 11. 什麼是<Type>叫什麼?
- 12. Boost:什麼是「便利標題」?
- 13. navigationItem的標題是什麼字體?
- 14. 什麼樣的標題簽名是0x7473657571655220?
- 15. zlib標題是什麼樣的?
- 16. OSGi列表,這些標題是什麼?
- 17. Perl中標題的含義是什麼?
- 18. 什麼是UIBarButtonItem的可能標題?
- 19. H264 NAL標題是什麼意思?
- 20. 聲明瞭copy_from_user()的標題是什麼?
- 21. 什麼是$ @和$ <Makefile?
- 22. 什麼是<\/script>?
- 23. {< >}是什麼意思?
- 24. <+>是什麼意思?
- 25. <>是什麼意思?
- 26. <>是什麼意思?
- 27. 什麼是<?=在C++中?
- 28. 什麼是(<type>?)?
- 29. 什麼是<PrivateImplementationDetails>?
- 30. Bash語法:什麼是「<<」?
能詳細解釋它是如何轉發引用? – wp2 2010-11-29 03:57:32
@ wp2:它只聲明類型而不定義它們。爲什麼不自己偷看呢?它很小。 – 2010-11-29 03:58:55
在foo.cc中`#include`有什麼好處,而不是直接在foo.h中做? –
wp2
2010-11-29 07:46:41