2013-06-24 33 views
5

在C++中,你允許將多個源文件中定義在同一個頭文件中的類的定義分開嗎?例如,如果我有一個定義類Quad2和Quad3的文件,我可以在Quad2.cpp和Quad3.cpp文件中定義類Quad2,但仍然在同一個頭文件Quad.h中?跨多個源文件分割在同一頭文件中定義的類的定義是否合法?

這會被認爲是非法的嗎?

+2

這聽起來像你正在跨文件實現不同的類,而不是分裂一個類。 –

+0

的確,我想一個更好的措辭是,您可以將同一個頭文件中定義的類的定義拆分爲多個源文件。謝謝,評論我會更新這個問題。 – teddy

回答

5

是的,你可以在不同的實現文件中從同一個頭文件實現不同的類。

頭文件只不過是在編譯時注入到源文本內容。編譯器本身完全沒有頭的概念。在編譯器看到任何東西之前,頭文件在預處理器中解析。

因此,對於類的定義和實現駐留在哪些文件上沒有任何要求。關於什麼屬於頭文件的規範以及實現文件中的屬性都與最佳實踐有關,與編譯器強制執行的規則無關。也就是說,你將類定義放在頭文件中,因爲這樣可以很容易地注入該類的實現以及任何想要使用該類的代碼。

1

這完全有效。您可以在不同的源文件中瘋狂地分配您的函數定義。如果鏈接器找不到定義,鏈接器會將所有內容放在一起並投訴。

切記:編寫#include <some_header.h>就像將頭部的完整內容複製到該位置的源文件中。如果在源文件Quad2.cppQuad3.cpp中包含Quad2.hQuad3.h,那麼這將具有完全相同的效果,就像您將兩個標頭放入一個文件Quad.h並將其包含在cpp文件中一樣。使用成對的頭文件和實現文件只是一個慣例(這是一個很好的問題)。

1

只要嘗試一下,看看自己!但不,這不是非法的。一種會讓人們感到困惑的方法(恕我直言)會有Quad2.h和.cpp,Quad3.h和.cpp,並且爲了方便,在Quad.h中包含Quad2.h和Quad3.h。

沒有什麼會強迫你,但試圖保持與X.cpp關聯的模式X.h,這是很常見的做法。

2

是的,完全合法。實際上,如果您想將代碼拆分爲更小的文件(當然,這樣做可能沒有任何好處),您可以使用Quad2A.cpp和Quad2B.cpp。

然而,分離源的一個缺點是編譯器難以內聯很小的函數(或僅使用一次)。大多數編譯器只會內聯在同一個編譯單元中的函數。因此,如果Quad3.cpp使用Quad2.cpp中的某些內容,那麼如果它們位於同一個文件中,可能會內聯,但如果它們位於單獨的文件中,則不會。但是,這不應該成爲您設計的決定性因素 - 只是提及它是「讓我們分開」的副作用之一。

相關問題