我想你們都知道什麼是標題中的循環依賴。 它的結果通常是這樣的:C++頭文件中的循環依賴。怎麼找?
錯誤:「MyClass的」在此範圍
未聲明如果程序很短很清楚該怎麼做。 但如果程序有幾十個文件...
我的問題是「是否有一些算法找到循環依賴?」 我的意思是某些步驟可以讓你獲得成功,而不僅僅是「直到你找到它才能查看代碼」。
可能是一些程序,這樣做?
我想你們都知道什麼是標題中的循環依賴。 它的結果通常是這樣的:C++頭文件中的循環依賴。怎麼找?
錯誤:「MyClass的」在此範圍
未聲明如果程序很短很清楚該怎麼做。 但如果程序有幾十個文件...
我的問題是「是否有一些算法找到循環依賴?」 我的意思是某些步驟可以讓你獲得成功,而不僅僅是「直到你找到它才能查看代碼」。
可能是一些程序,這樣做?
文檔工具Doxygen可以生成顯示依賴關係的圖表。我用它來顯示不同庫的頭文件之間的循環依賴關係。
But if the program has tens of files...
然後它仍然很短。轉到編譯器錯誤消息中提到的行,查看類是否可用。如果問題出現在* .cpp,#include相應的文件中。如果標題出現問題,請添加前向聲明(class MyClass;
)。如果前向聲明不夠,將聲明myclass的#include文件。如果這會導致循環依賴,那麼每個頭文件的類型太多。將標題拆分爲幾個較小的標題。其中一種方法是在整個程序中爲每個頭文件分配一個類,但在很多情況下,這可能是矯枉過正的。
至少有一個我知道的編譯器(Visual C++)有一個名爲「show includes」的選項,可以幫助您跟蹤包含順序。這可以幫助您找出週期發生的位置。如果你的編譯器沒有這樣的選項,你可以在你的文件的開頭添加#pragma消息(或者等價的)來追蹤它。
相關但不是真正的重複:http://stackoverflow.com/questions/614794/c-c-detecting-superfluous-includes通常很難對不能編譯的程序執行靜態分析。但是我還沒有發現即使在龐大的代碼庫中也很難檢測循環依賴。 – pmr
我對此的解決方案是從不在頭中包含其他文件,並且始終在實現.cpp文件中包含所需的頭文件。通常我有(用VS)所有常用的東西的預編譯頭文件,然後是我正在處理的特定項目的所有東西的另一個頭文件。 – Robinson