为什么 Mac 上的 clang 会自动包含一些丢失的标题?

Kos*_*nko 2 c++ gcc include clang

我注意到clang++包含一个缺失的标头 -<limits>在 Mac 上,而g++在 Linux 上显示有关它的错误。现在我想知道为什么clang 会这样做,而gcc不会。以及我如何强迫clang不这样做。

这是一个示例代码,它在 Mac 上由clang编译,但在 Linux 上由gcc 编译

#include <iostream>
using namespace std;

int main()
{
    cout << "int max: " << numeric_limits<int>::max() << endl;
}
Run Code Online (Sandbox Code Playgroud)

UPD

我查看了图书馆,这是我发现的。

内部<iostream>包含<istream>,它定义>>了不同类型的运算符。<istream>想知道short,intstreamsize类型的限制。

clang++使用libc++标准库,为此目的使用std::numeric_limits来自<limits>in 的类模板<istream>。这就是为什么在包含此标头时会自动<iostream>包含该标头的原因。

g++使用libstdc++标准库,它使用__gnu_cxx::__numeric_traits类模板 from<ext/numeric_traits.h>而不是<limits>in <istream>( <bits/istream.tcc>)。该标题中还有一条注释,解释了为什么他们不使用<limits>

<limits> 很大,我们避免包括它

使用的编译器:

> clang++ --version
Apple LLVM version 8.0.0 (clang-800.0.42.1)

$ g++ --version
g++ (Debian 4.9.2-10) 4.9.2
Run Code Online (Sandbox Code Playgroud)

Pet*_*ker 5

在 C++ 中,与 C 不同,标准头文件允许用于#include其他标准头文件。这有时会导致像您看到的那样的神秘错误:一个编译器<iostream>包含<limits>而另一个不包含。解决方案是始终包含您使用的任何名称所需的标头。在这种情况下,这意味着#include <limits>在您的代码中,即使它与一个编译器一样可以正常编译。#include已经被拉入的头文件没有坏处,所以这两个编译器都可以。有时很烦人,但事情就是这样。