【发布时间】:2017-04-10 17:09:54
【问题描述】:
我注意到 clang++ 包含一个缺失的标头 - Mac 上的 <limits>,而 g++ 在 Linux 上显示有关它的错误。现在我想知道为什么 clang 会这样做,而 gcc 不会。以及如何强制 clang 不这样做。
这是一个示例代码,它在 Mac 上由 clang 编译,但在 Linux 上不是由 gcc 编译:
#include <iostream>
using namespace std;
int main()
{
cout << "int max: " << numeric_limits<int>::max() << endl;
}
UPD
我查看了图书馆,这就是我发现的。
<iostream> 内部包含<istream>,它为不同类型定义了>> 运算符。 <istream> 想知道 short、int 和 streamsize 类型的限制。
clang++ 使用 libc++ 标准库,该库使用来自<limits> 中的<istream> 中的std::numeric_limits 类模板用于此目的。这就是包含<iostream> 时自动包含此标头的原因。
g++ 使用 libstdc++ 标准库,它使用来自<ext/numeric_traits.h> 的__gnu_cxx::__numeric_traits 类模板,而不是在<istream> (<bits/istream.tcc>) 中使用<limits>。该标题中还有一条注释解释了为什么他们不使用<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
【问题讨论】: