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

时间:2016-11-26 14:49:16

标签: c++ gcc include clang

我注意到 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>想了解shortintstreamsize类型的限制。

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

g ++ 使用 libstdc ++ 标准库,该库使用<iostream>中的__gnu_cxx::__numeric_traits类模板,而不是{{1}中使用<ext/numeric_traits.h><limits>)。该标题中还有一条评论,解释了为什么他们不使用<istream>

  

<bits/istream.tcc>很大,我们避免包含它

二手编译器:

<limits>

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

clang标题的<iostream>版本可能#include标题为<limits>,因此您会自动将其#include <iostream> { {1}}标题。

你无能为力。这就是编译器库的实现方式。您只需添加

即可
#include <limits>

到这个文件,它应该在两个平台上编译。