2017-08-09 46 views
3

問題是關於包含一個不必要的頭,以避免在子文件中多次調用它。 這裏的情況,我有幾個文件:C++「額外」頭文件

srlogger.h 

srinterface.h 

srinterface.cc 
#include <srinterface.h> 
#include "srlogger.h" 

srbinhttp.h 
#include "srinterface.h" 

srbinhttp.cc 
#include <srbinhttp.h> 
#include "srlogger.h" 

srsocket.h 
#include "srinterface.h" 

srsocket.cc 
#include <srsocket.h> 
#include "srlogger.h" 

srhttp.h 
#include "srinterface.h" 

srhttp.cc 
#include <srhttp.h> 
#include "srlogger.h" 

現在,我想要做的就是刪除所有顯示的.cc文件#include "srlogger.h",而是它包括對srinterface.h文件:

srinterface.h 
#include "srlogger.h" 

因爲所有的.cc文件都包含srinterface.h,所以srlogger.h會被覆蓋。 現在,爲什麼這會很糟糕?

請不要說你只應該包含必要的頭文件來編譯而沒有額外的東西,這是不夠的解釋。

我想知道在實際的例子,爲什麼這將是壞的。

哦,如果有人從srinterface.h中刪除#include "srlogger.h"它會破壞另一個文件,這是一個弱解釋。包含後的評論很容易提醒其他人。

最讓我感興趣的是如果它會以不好的方式影響編譯,那麼對象或可執行文件的大小會因此而改變,這會影響性能嗎?

或者你有一個很好的解釋,爲什麼這是不好的。

PS:如果您好奇我爲什麼要這麼做,是因爲我在映射文件之間的依賴關係,並且做了這樣的事情,我可以在所有依賴關係之間創建圖形化可視化,從而更容易瞭解拼圖的各個部分如何組合在一起。將子標題傳送到較高層級標題中的公共標題將在所有文件之間創建更有組織的結構。

+1

這並沒有解決這個問題,但使用'#包括<...>'系統頭和'#包括「...」'爲自己的頭。 –

+0

@佩特貝克爾 - 我不反對,但你應該解釋*爲什麼*。另外,如果你告訴你的編譯器關於你自己的包含目錄,那麼使用「<>」就可以了。在任何情況下,你的評論並沒有解釋這兩種形式之間的差異,而只是說「做這個」,這實際上並沒有那麼有用。 –

+1

@JesperJuhl - 我會同意,如果這是一個答案。但事實並非如此,而且也不是爲了解決這個問題,而是短暫的,而不是爲了開始討論。 –

回答

3

潛在的負面影響是編譯時間之一。如果有人包含不需要它拖拽的頭部的頭部,則該編譯單元的編譯時間將會增加,原因不明。

對於幾秒鐘內編譯的玩具項目或小項目(幾百個文件),這並沒有真正的區別。 但是,當您處理數百萬行代碼的項目時,它們已經花費了大量一小時的時間進行編譯,並且將一個包含到12000個其他文件包含的標題中,因爲您無法將其明確添加到實際需要它的120個文件中(但恰巧包含了常見的頭文件) - 那麼您不會受歡迎,因爲您只是將每個人的平均構建時間提高了幾分鐘。

還有一種風險(在糟糕的代碼基礎上),您(非理性地)拖拽到其他文件的頭可能會重新定義那些打破該源文件的東西,甚至不需要其他頭文件。

基於上述原因,認爲,標題應該只包括他們真正需要自己,不能向前聲明。執行文件應該只有包含頭文件他們真的需要(並且包括他們自己的頭文件第一個以確保它們是自包含的)。

希望能回答你的問題。

+0

我可以看到你的觀點,這很有道理,謝謝。 我也做了一些更多的研究,我猜對象文件和程序會因爲它而增加。 我發現顯示了編譯和鏈接這個視頻很有用,得跳到中間雖然: https://www.youtube.com/watch?v=5UMHbzZGQuE&index=17&list=PLggLP4f-rq02gmlePH-vQJ8PF6hyf08CN – Daniel

1

「的問題是關於包括不必要的報頭,以避免調用它在子文件多次。」

包括守衛會解決,包括在同一文件的多個頭的這個問題的可行部分。包括警衛將在一定程度上減少不必要的包含。請參見下面的鏈接:

C++ #include guards

一個包括後衛是通過添加以下到你的頭文件提出:

//at the very top of the header 
#ifndef NAMEOFHEADER_H 
#define NAMEOFHEADER_H 

// header info 

//at the very last line of the header 
#endif 

這將讓你積累相同的頭文件中的另一多次。 h或.cpp文件。

而作爲在下面的評論指出,即使每頭有包括你仍然可以使用,甚至不需要你的文件的信息由編譯器在其預處理指令被定義結束了警衛。這在跨多個文件的包含鏈中必然會發生。

+1

包括警衛不當標題包含在10000個文件中時可以提供幫助,但是添加到標題中的額外內容僅需要10個。所有10000個源文件現在需要支付編譯該額外標題的費用(並且這實際上增加了實時 - 分鐘)很快 - 對於大代碼庫)。 –

+0

好點 - 將添加一個編輯。 – 9Breaker