2011-10-03 78 views
2

我試圖儘量減少頭項目包含在一個項目中,最大限度地使用正向聲明,並需要清楚C++編譯的過程如何工作。C++多文件編譯過程

它從我們分配對象A的main.cpp開始,因此我們包含A.h. A類使用B類和C類,所以我包括B.h和C.h.現在,如果我想在main.cpp中分配B,編譯將會失敗。

我很容易在main.cpp中包含B.h,但我想知道它是否真的有必要,因爲我已經包括A.h和A.h,我包括B.h.我閱讀了一些關於這個主題的討論,其中有關於源文件的遞歸和重新編譯的內容。那麼這究竟是如何工作的?

感謝您的任何建議。 :)

+7

間接包含*是*包含。當你包含一個頭文件時,編譯器的行爲就好像頭文件的每一行都是文件的一部分。當您在標題中包含標題時,就好像您將該內部標題的每一行復制/粘貼到外部標題的每一行,並因此複製到每個包含它的文件中。如果編輯在您描述的情況下失敗,則其中一個標題已損壞。 (你可以創建一個簡短的,完整的,可編輯的破損示例嗎?) –

+0

@DavidSchwartz:是的,沒有,預處理器設計用於檢測標頭警衛(和'#pragma once'聲明),並避免打開第二個頭文件時間。所以是的,理論上你是*再次包括文件,但實際上成本可以優化。 –

+0

@David Schwartz:嗯,現在看來我只是需要重新編譯代碼,還有一些部分編譯的事情正在進行。我開始深入研究這個問題的原因是,我正在解決交叉問題 - 包括兩個類和一個朋友告訴我,他使用一個技巧,他包含一個頭文件,在這個包含的頭文件中,他只是使用前向聲明和包括cpp文件中的前一個類標題。所以我很困惑cpp文件在哪裏進來。 – Maci

回答

1

作爲一個簡單的經驗法則,您需要在任何時候需要對齊,接口或大小時定義符號。如果頭只將一個類型引用爲指針,則只需要聲明它。

所有引用標題的編譯單元都必須經過獨立理解的步驟。這就是爲什麼頭中的代碼超線性增加編譯時間的原因。

如果您有興趣,您可以準確瞭解預處理器爲編譯器準備的內容。 GCC具有以下語法。

g++ -E main.cpp 

雖然我不能引用它,但MSVC具有類似的功能。

我可以很容易地包括了Bh在main.cpp中,但我想知道如果它真的 必要的,因爲我已經有包括阿和阿我包括 了Bh

這我想是情況問題。忽略頭文件的主要煩惱是,通常發生的是其他人在代碼庫的不同部分中更改某些內容,並且您必須猜測從源代碼控制進行更新時爲什麼缺少符號。本質上,您可以在根本不清楚的標頭之間創建依賴關係。

如果我的異想天開是合法的,你可以將一個include包含到空cpp文件中的任何頭文件中,然後它就可以編譯。我不明白你爲什麼不想要這樣做,儘管我不打算爲所有情況下的辯護做好準備。

+1

「*您需要在任何需要對齊或界面時定義符號*」或大小。 – ildjarn

+0

大小可能是所有它的相關位,ty;) –