2011-12-01 40 views
10

C++和C中的翻譯單元有什麼不同?C和C++中的翻譯單元

在其他文章中,我讀到一個頭文件和源文件構成一個翻譯單元,但是 可以單獨將一個源文件稱爲C++中的翻譯單元,它包含一個文件中的所有定義?

+4

預處理的源文件是翻譯單元。 –

+1

@KerrekSB難道不是答案嗎? – daramarak

+0

@KerrekSB,代表帽? :) –

回答

22

翻譯單元不是「標題和源文件」。它可能包含一千個頭文件(還有一千個源文件)。

翻譯單元在被預處理後就是通常所說的「源文件」或「.cpp文件」。如果源文件#include是其他文件,那麼這些文件的文本將被預處理器包含在翻譯單元中。 C和C++在這個問題上沒有區別。

+0

如果我將我的類定義放在'.cpp'中,而不是使用'.h'來放置類聲明。我可以稱這個'.cpp'爲翻譯單位嗎? – user103214

+1

是的,沒有頭文件的要求。 –

+3

@ user974191:你應該使用頭文件來避免複製你的代碼。 '#include'機制允許你編寫一次並讓編譯器爲你複製它:這是一個代碼組織的問題,但與翻譯單元的概念沒有多大關係。 –

1

在預處理時,頭文件被添加到.cpp文件中,所以編譯器基本上正在處理一大段代碼,包含.cpp和所有.h文件,都是由「#include」添加的。

這是翻譯單元。

0

翻譯單元實際上就是源文件和頭文件通過預處理(它使用頭文件擴展源文件)和預編譯後獲得的內容。編譯器使用翻譯單元生成您在編譯器輸出目錄中看到的.obj文件。

+0

- 預編譯(據我所知,沒有這樣的步驟) –

+1

生成預編譯頭文件 - 在大型C++項目中很常見。 – ChrisBD

+0

啊!我不會真的把它編成預編,但我現在明白了。至於常見......是和不是。我正在研究共享數百萬行代碼的項目,而最好的解決方案不是預編譯頭文件,而是在同一團隊(CCache)的開發人員之間共享生成的對象並分發構建。 –

1

這取決於你的意思「區別」。 C和C++ 對其進行了類似的定義:基本上,編譯源文件(因此,所有包含的頭文件,擴展的宏等)時編譯的所有內容。但這在兩種語言中並不是一回事; 之類的模板意味着翻譯單元不使用C表現不同 ++比C.(C++有一個定義規則,例如。)

+0

可以通過一個定義規則在兩個.cpp文件中有兩個具有相同名稱的類定義嗎?謝謝。 – user103214

+0

@ user974191只有它們包含完全相同的標記,並且所有符號都綁定到完全相同的東西。這就是爲什麼引入了未命名的命名空間的原因:將本地類放在一個未命名的命名空間中,並且它們的完全限定名稱是不同的;他們不再是同一個班級,因爲他們不再有相同的名字。 –

-2

組由編譯器看到的源文件和轉換爲一個單元

+0

如果你能用完整的句子解釋你的答案會更有用。 – ilke444