在Xcode中,当我包含<iostream>时,似乎还包括stdlib.h。为什么?</的iostream>

时间:2015-03-17 09:20:29

标签: c++ xcode include

当我使用Xcode时,我对 iostream 的包含有疑问。

包含 iostream 后,似乎 stdlib.h 也会自动包含,因为当我写“ merg ”时,< Xcode的强>>代码完成给了我“ mergesort ”这个函数,它是 stdlib.h 中的一个函数,根据Xcode的文档< / strong>即可。但我没有包括stdlib.h 明确。所以我想是iostream的包含引起了stdlib.h的包含。任何人都可以告诉我为什么?

根据 C标准,stdlib.h没有像mergesort这样的函数,为什么在Xcode中,stdlib.h有这样的函数?是不是意味着stdlib.h在Xcode不是标准的吗?

如何获取每个头文件的依赖关系的 map ,例如,对于头文件example.h,我怎么知道哪个.h文件包含在此exemple.h中,其他.h文件本身包含文件exemple.h。

对不起这个长问题,非常感谢你的回答!

2 个答案:

答案 0 :(得分:2)

简而言之:它是实现定义的。

这意味着它取决于特定的标准库实现。该标准明确允许标准库头包含其他标准库头(或至少在其中定义符号); C ++ 11 17.6.5.2/1:

  

C ++标头可能包含其他C ++标头。 C ++头应提供声明和定义   出现在其概要中。在其概要中显示的C ++头文件应包含其他C ++头文件   显示在其他标题的概要中的声明和定义。

为了保持代码的可移植性(即使只是在相同编译器/标准库的版本之间),您应该遵循以下规则:

  1. 不要依赖传递包含。始终明确包含您需要的所有标题。

  2. 不要对传递包含感到惊讶。他们是合法的。

答案 1 :(得分:0)

  

任何人都可以告诉我为什么?

据推测,iostream实施中的某些内容需要来自stdlib.h的内容。标准标题允许包含其他标准标题(如果需要);并且,由于许多标头包含内联函数定义,因此它们将需要这些函数使用的任何标头。

  

为什么在Xcode中,stdlib.h有这样的功能?

它是标准库的BSD extension

  

这是否意味着Xcode中的stdlib.h不是标准的?

确实如此。

  

如何获取每个头文件的依赖关系的映射,例如,对于头文件example.h,我怎么知道这个exemple.h中包含哪些其他.h文件,以及哪个.h文件本身包含文件exemple.h。

大多数编译器都可以输出翻译单元的依赖关系。例如,GCC有-M选项来执行此操作。