在 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 的 Code Completion 给了我函数“mergesort”,这是一个根据 Xcode 的 文档,在 stdlib.h 中运行。但是我没有明确地stdlib.h 。所以我猜是 iostream 的包含导致了 stdlib.h 的包含。谁能告诉我为什么?

根据C标准,stdlib.h没有mergesort之类的功能,为什么在Xcode中,stdlib.h有这样的功能?是不是说明Xcode中的stdlib.h不是标准的?

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

抱歉这个问题很长,非常感谢您的回答!

简而言之:它是 implementation-defined。

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

A C++ header may include other C++ headers. A C++ header shall provide the declarations and definitions that appear in its synopsis. A C++ header shown in its synopsis as including other C++ headers shall provide the declarations and definitions that appear in the synopses of those other headers.

为了保持代码的可移植性(即使只是在同一 compiler/standard 库的不同版本之间),您应该遵循以下规则:

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

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

Any one could tell me why?

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

why in Xcode, the stdlib.h has such a function?

这是标准库的 BSD extension

Does it mean that the stdlib.h in Xcode is not a standard one?

确实如此。

How can I get a map of the dependency of every header file, for exemple, for a header file example.h, how can I know which other .h files are included in this exemple.h, and which other .h files include in themselves the file exemple.h.

大多数编译器都可以输出翻译单元的依赖关系。例如,GCC 有一个 -M 选项可以做到这一点。