当我使用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。
对不起这个长问题,非常感谢你的回答!
答案 0 :(得分:2)
简而言之:它是实现定义的。
这意味着它取决于特定的标准库实现。该标准明确允许标准库头包含其他标准库头(或至少在其中定义符号); C ++ 11 17.6.5.2/1:
C ++标头可能包含其他C ++标头。 C ++头应提供声明和定义 出现在其概要中。在其概要中显示的C ++头文件应包含其他C ++头文件 显示在其他标题的概要中的声明和定义。
为了保持代码的可移植性(即使只是在相同编译器/标准库的版本之间),您应该遵循以下规则:
不要依赖传递包含。始终明确包含您需要的所有标题。
不要对传递包含感到惊讶。他们是合法的。
答案 1 :(得分:0)
任何人都可以告诉我为什么?
据推测,iostream
实施中的某些内容需要来自stdlib.h
的内容。标准标题允许包含其他标准标题(如果需要);并且,由于许多标头包含内联函数定义,因此它们将需要这些函数使用的任何标头。
为什么在Xcode中,
stdlib.h
有这样的功能?
它是标准库的BSD extension。
这是否意味着Xcode中的
stdlib.h
不是标准的?
确实如此。
如何获取每个头文件的依赖关系的映射,例如,对于头文件example.h,我怎么知道这个exemple.h中包含哪些其他.h文件,以及哪个.h文件本身包含文件exemple.h。
大多数编译器都可以输出翻译单元的依赖关系。例如,GCC有-M
选项来执行此操作。