簡體   English   中英

在Xcode中,當我包含 <iostream> ,似乎還包括了stdlib.h。 為什么?

[英]In Xcode, when I include <iostream>, it seems that stdlib.h is also include. Why?

使用Xcode時,我對iostream的包含有疑問。

包含iostream之后 ,似乎還自動包含了stdlib.h,因為當我編寫“ merg ”時,Xcode的代碼補全為我提供了功能“ mergesort ”,該功能是根據stdlib.h中的功能。 Xcode 但是我沒有明確地包含stdlib.h。 因此,我猜想是iostream的包含導致了stdlib.h的包含。 誰能告訴我為什么?

根據C標准 ,stdlib.h沒有像mergesort這樣的功能,為什么在Xcode中stdlib.h具有這樣的功能?是否表示Xcode中的stdlib.h不是標准的?

我如何獲取每個頭文件依存關系 ,例如,頭文件example.h,如何知道此exemple.h中包括哪些其他.h文件,以及在其中包括哪些其他.h文件?本身就是文件exemple.h。

對不起,這個問題很長,非常感謝您的回答!

簡而言之:它是實現定義的。

這意味着它取決於特定的標准庫實現。 該標准明確允許標准庫頭包含其他標准庫頭(或至少在其中定義符號); C ++ 11 17.6.5.2/1:

C ++標頭可以包括其他C ++標頭。 C ++標頭應提供在其提要中出現的聲明和定義。 提要中顯示為包括其他C ++頭的C ++頭應提供出現在那些其他頭的提要中的聲明和定義。

為了使您的代碼具有可移植性(即使僅在同一編譯器/標准庫的版本之間),也應遵循以下規則:

  1. 不要依賴可傳遞包含。 始終明確包含您需要的所有標頭。

  2. 不要對傳遞性包含感到驚訝。 他們是合法的。

誰能告訴我為什么?

大概在iostream的實現中需要stdlib.h某些內容。 如果標准標頭需要,則可以包含其他標准標頭; 並且,由於許多標頭包含內聯函數定義,因此它們將需要這些函數使用的所有標頭。

為什么在Xcode中, stdlib.h具有這樣的功能?

它是標准庫的BSD擴展

這是否意味着Xcode中的stdlib.h不是標准的?

確實如此。

我如何獲取每個頭文件的依存關系圖,例如頭文件example.h,如何知道此exemple.h中還包含哪些其他.h文件,以及如何在其中包含哪些其他.h文件?本身就是文件exemple.h。

大多數編譯器可以輸出翻譯單元的依賴項。 例如,GCC具有-M選項來執行此操作。

暫無
暫無

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

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