2012-09-30 85 views
2

階段7:分隔標記的空白字符不再顯着。 每個預處理令牌都被轉換爲令牌。得到的 令牌在語法和語義上進行分析並翻譯爲 翻譯單元。階段8:翻譯的翻譯單元和實例化單元如下組合 :檢查每個翻譯的翻譯單元,以產生所需實例的列表 。所需的 模板的定義已定位。它是實現定義是否需要包含這些定義的翻譯單元的來源 可用。所有需要的實例化都執行到 產生實例化單元[注:這些實例與翻譯的 翻譯單元類似,但不包含對未被實例化的 模板的引用並且沒有模板定義。 - 結束]如果任何實例化失敗,該程序是 格式不正確。C++ 11翻譯階段8混淆

我已經刪除了一些註釋以縮短粘貼的文本。

爲什麼在翻譯單元已經在C++編譯階段8中翻譯之後,模板是否定位和實例化?考慮到兩階段名稱查找,這些步驟是否不應該在階段7中進行?

+1

一遍又一遍地讀這個問題我有點覺得你誤解了「編程問題的問答網站」實際上意味着什麼。你不會因爲「學習編程」而留下「你自己理解的問題」,然後期待一個答案。 – hakre

+0

我會嘗試澄清hakre的評論:在幾乎所有情況下,最好只有一個SO問題只包含一個編程問題,例如「爲什麼C++編譯階段8中的模板定義位置步驟?」帶有標準摘要的問題文本,並提到第7階段的兩階段查找。僅此一項就是一個問題。在單個問題中填充太多會減少問題對於SO的價值,並減少您得到的答案數量。另請參閱[FAQ](http://stackoverflow.com/faq)。 – gimpf

+0

感謝您澄清hakre的評論gimpf,希望這次更好,儘管在我看來你似乎理解了這些問題。當我試圖向某人解釋某件事情時,我傾向於將他不理解的事物分開,並依次處理這些事件;我覺得這樣做更好,更高效,所以我選擇了初始佈局。 – Dan

回答

0

這是一個保留從now-deprecated導出模板功能。導出模板允許將類和函數模板的定義與其聲明分開(在適當的意義上)。

作爲實現細節,從模板實例化中分離翻譯單元翻譯可能是有意義的,因爲它可以減少冗餘工作實例化模板。但是,大多數當前編譯器在翻譯單元轉換處實例化所有模板,並在鏈接時消除重複的實例。

希望概念和模塊將允許類似的功能在將來重新引入該語言。

0

我相信這部分與模板化類型的預編譯有關。任何模板化的類型都是「實例化單元」。如果模板類型處於預編譯狀態,則需要在此階段處理。