簡體   English   中英

逃避包括.h文件的頭

[英]Evading including headers to the .h file

有人告訴我,如果可以回避的話,請勿在.header中包含太多類,而應在.cpp中包含它們。 為此,他們告訴我創建原型類,例如:

class abc;

代替:

include "abc.h"

但這只是在abc類未用作屬性或返回值的情況下。 如果是參數,我可以使用原型...為什么?

另外,為什么在.h文件中包含如此多的標頭如此糟糕?

謝謝

當您向前聲明課程時:

class abc;

是成為不完整類型 ,並且您只能對不完整類型做某些事情。 例如,任何需要了解班級成員,甚至需要了解班級規模的知識,都需要完整的聲明。

至於包括其他標頭中的標頭,我可以想到以下兩個參數:

  1. 縮短了構建時間。
  2. 更少的依賴項。

根據項目的大小,編譯器,硬件等的不同,第一個可能相關,也可能不相關。第二個也有問題,因為它並沒有真正減少類之間的依賴關系。

必須使用前向聲明的一種情況是,在不同標頭中定義的兩個類之間具有循環依賴關系。

如果是參數,我可以使用原型...為什么?

每當不需要訪問已聲明類的內部結構時,例如在聲明指針,引用或將其作為參數傳遞時,都可以使用前向聲明。 您不能使用前向聲明來繼承類,調用其任何成員函數或訪問其成員或聲明非指針/引用類型的成員:這是因為編譯器必須知道該類的內部結構才能執行以上任何操作。

為什么在.h文件中包含這么多標頭如此糟糕?

這本身並不普遍“不好”,但是對於許多編譯器而言,這可能會減慢編譯過程,因此通常將包含的內容減至最少。 現代編譯器具有有用的功能(例如預編譯的標頭)以最大程度地減少影響,因此使用前向聲明可以使您在實際操作中比實際問題更具美感。

class abc;

當您向前聲明一個類型時,編譯器會將其視為Incomeplete類型,並且它不具有有關該類型的內存布局/組成的任何信息。 因此,您不能要求編譯器執行任何需要其了解此信息的操作。

使用不完整類型,您不能:

  • 用它聲明一個成員。
  • 使用此類型定義函數或方法。

但是使用不完整類型,您可以:

  • 聲明一個成員作為不完整類型的指針。
  • 聲明接受/返回不完整類型的函數或方法。
  • 定義接受/返回不完整類型的指針(但不使用其成員)的函數或方法。

為什么在.h文件中包含這么多標頭如此糟糕?

不好是因為:

  • 僅包含標頭僅復制將標頭的內容粘貼到當前翻譯單元。 這會增加編譯時間並建立依賴關系。

包括許多標頭很不好,因為如果您更改其中的一個標頭,那么您也必須編譯文件,這聽起來似乎不是問題,但是對於大型程序,編譯+鏈接可能會花費很多時間(有時數小時)

在需要生成代碼之前,編譯器只需要知道名稱(而不是組成部分)即可。

因此,前進聲明是必經之路-因為它不需要加載和解析。

順便說一句-它有助於使makefile不必開始重新編譯內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM