簡體   English   中英

C / C ++前向聲明與包含

[英]C/C++ Forward declaration vs. Include

當你包含一些文件以及當你轉發聲明一些函數/類時發生了什么,會發生什么? 如果兩個文件包含相同的文件將第一個成功讀取所有功能第二個將失敗但仍然能夠使用的功能?

當我轉發聲明某個功能時會發生什么? 這個功能現在“保存”了,我可以在任何地方使用它,或者只知道同一個文件? 那么為什么帶有include的兩個文件(帶有警衛的文件)會起作用?

我可以在主要內容中包含所有內容而不再費心嗎?

編輯:

為什么cpp文件應該包含他們的頭? 如果我不包括它們怎么辦?

當你包含一些文件以及當你轉發聲明一些函數/類時發生了什么,會發生什么?

當您包含文件時,預處理器會將其內容“復制並粘貼”到包含源中。 當你轉發聲明一個函數/類時,你聲明一個不完整的類型,讓翻譯單元的其余部分知道存在具有該名稱的函數/類,並使其在允許不完整聲明的上下文中可用。

如果兩個文件包含相同的文件將第一個成功讀取所有功能第二個將失敗但仍然能夠使用的功能?

如果包含的文件包含適當的包含保護 ,則同一翻譯單元中的第二個包含將實際上是無操作。 如果兩個不同的源文件包含相同的頭文件,則完整內容將包含在兩個文件中。

當我轉發聲明某個功能時會發生什么? 這個功能現在“保存”了,我可以在任何地方使用它,或者只知道同一個文件? 那么為什么帶有include的兩個文件(帶有警衛的文件)會起作用?

該函數只能在包含前向聲明的翻譯單元中使用。 通常,每個源文件(.cpp)是不同的轉換單元,宏定義(標題保護的定義)以及聲明/定義在該轉換單元內是有效的。 標題保護防止同一個頭文件在同一個翻譯單元中被多次包含,以防止多個聲明錯誤。

簡短回答:轉發類/函數允許編譯器實際上不必編譯整個類/函數,除非需要。

答案很簡單:轉發類/函數就像聲明一個類/函數而不定義它一樣。 您承諾稍后會定義它,但是現在您只想通知編譯器它存在。 您通常在頭文件中執行這些正向減速。 這通常會導致更快的編譯時間,因為在包含您的標頭的.cpp文件中,只有那些實際需要您轉發的類並包含它的相應頭文件需要實際編譯包含類的代碼。

當你包含一些文件以及當你轉發聲明一些函數/類時發生了什么,會發生什么?

當你include一個文件,預處理器有效地復制粘貼整個included文件到文件做include ING。 當你轉發聲明一個函數/類時,你告訴編譯器它存在,但你不需要整個頭文件。 當您具有循環依賴性時,這是必需的 ,並且在其他地方大大減少了編譯時間。

如果兩個文件包含相同的文件將第一個成功讀取所有功能第二個將失敗但仍然能夠使用的功能?

如果同一個文件在一個翻譯單元( .cpp文件)中被包含兩次,則兩者都將“成功”,但如果標題包含任何類型的保護,則第二次不會加載任何內容,因為預處理器已經“將它“復制到翻譯單元中,並且第二次復制它會使所有內容重復,這將是一個錯誤。 因此,所涉及的所有文件都可以使用到目前為止所包含的所有標題中的所有函數。

當我轉發聲明某個功能時會發生什么? 這個功能現在“保存”了,我可以在任何地方使用它,或者只知道同一個文件? 那么為什么帶有include的兩個文件(帶有警衛的文件)會起作用?

是的,如果您在標頭中轉發聲明一個函數/類,它可以被包含該標頭的任何其他文件使用。

我可以在主要內容中包含所有內容而不再費心嗎?

大概。 一旦你得到更復雜的例子,你將最終得到循環依賴,這需要按特定順序聲明和/或定義某些事物。 除此之外,是的。 您可以將所有內容都包含在main中並保持簡單。 但是,您的代碼將需要FOREVER進行編譯。

為什么cpp文件應該包含他們的頭? 如果我不包括它們怎么辦?

然后該.cpp文件將不知道其他任何東西本身存在。 不是很有用。

暫無
暫無

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

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