2016-10-15 20 views
2

所以,我們使用#include告訴編譯器/鏈接器在哪裏找到一個類的所有相關代碼。把包括在所有正確的地方

看一看這樣的:

ClassC.h: 
    #include "ClassA.h"; 

ClassD.h: 
    #include "ClassC.h" 

比方說,我們在ClassD使用ClassA,但在某種程度上這是沒有辦法連接到ClassC。我們通過包含ClassC隱含地包含它,所以不會引發錯誤。但是,如果代碼更改並且不再需要ClassC(並且因此我們刪除#include "ClassC.h"),我們會得到未定義的參考錯誤,因爲ClassA現在未被引用。

有沒有辦法讓編譯器/鏈接器獨立查看每個* .cpp和分配的* .h,而不需要查看包含的.h文件?

如果是這樣的話,它不會查看ClassC.h並且看到它包含ClassA.h,但會拋出一個錯誤或至少一個警告,告訴我我沒有包含ClassA.h。這是更有意義的,因爲,只要類ClassD知道,ClassAClassC彼此沒有任何關係(在設定假設下,我使用ClassA而不依賴於ClassC)。

我認爲用這種方式編寫的代碼會更穩定,更具彈性。不是嗎?

另外,比方說,我們建立一個項目,它的工作原理。如果我們之前在代碼中引用某個類(X)比之前引用的類(X),那麼如果它正在使用某個其他類(Y),該程序中該點之間的某個其他源包含其他類該類以前的第一次出現。如果我們更緊密地包含每個明確使用它的頭文件,那麼這些錯誤永遠不會出現。

我知道我可以自己跟蹤所有這些,但是在大型項目中甚至中型項目中可能會錯過幾個或更多的項目。此外,有錯誤/警告會讓管理變得更容易。

我知道我有點複雜,但對我來說這似乎是一個很好的做法。

這甚至是一個好主意,它可以以某種方式設置在編譯器/鏈接器選項(例如CodeBlocks中的GNU gcc編譯器)?

+1

你應該檢查出包括警衛。 HTTPS://en.wikipedia。org/wiki/Include_guard – Gavin

+0

包括守衛非常好,並且阻止您在項目中包含相同的兩件事,我知道。我希望能夠在我的代碼中包含10個不同的地方,儘管編譯器/鏈接器只使用第一個地方。 – Karlovsky120

+0

我既不明白你想要解決什麼問題,也不知道你提出的解決方案 – user463035818

回答

1

比方說,我們在我們的ClassD中使用了ClassA,但以一種連接到ClassC的方式決不是 。我們通過包含 ClassC隱含地包含了它,因此不會引發錯誤。但是,如果代碼改變並且不再需要ClassC(並且因此我們移除#include「ClassC.h」 ),我們會得到未定義的參考錯誤,因爲ClassA現在是 現在未被引用。

如果您需要在您的ClassD使用ClassA,然後明確#include "ClassA.h"ClassD.h。做不是依靠隱含夾雜鏈。

+0

我想這樣做。我只想知道是否有編譯器爲我做檢查的方法。 – Karlovsky120

+0

@ Karlovsky120:在這一點上,我不知道你到底意味着什麼。編譯器沒有通靈的能力來猜測你想要的標題。無論如何,如果你不包括所需的頭文件,你會得到編譯器或鏈接器錯誤。 –

+0

我主要是說如果編譯器/鏈接器可以檢測include是顯式還是隱式,並且在其中發出警告是一個隱式包含。這可能很難做到,因爲一些隱含的包含(例如,從父類繼承的包含)會很好,因爲它們總是存在。 – Karlovsky120