我注意到 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 ++ 标准库,该库使用std::numeric_limits
中<limits>
的{{1}}类模板用于此目的。这就是为什么在包含<istream>
时自动包含此标头的原因。
g ++ 使用 libstdc ++ 标准库,该库使用<iostream>
中的__gnu_cxx::__numeric_traits
类模板,而不是{{1}中使用<ext/numeric_traits.h>
(<limits>
)。该标题中还有一条评论,解释了为什么他们不使用<istream>
:
<bits/istream.tcc>
很大,我们避免包含它
二手编译器:
<limits>
答案 0 :(得分:4)
在C ++中,与C不同,标准头文件允许#include
个其他标准头文件。这有时会导致你所看到的神秘错误:一个编译器的<iostream>
包含<limits>
而另一个则不包括#include <limits>
。解决方案是始终包含您使用的任何名称所需的标头。在这种情况下,这意味着代码中的#include
,即使它与一个编译器一样编译正常。 [Application(LargeHeap = true)]
已经被拉入的标题没有任何害处,因此两个编译器都可以。有时这很烦人,但事情就是这样。
答案 1 :(得分:0)
clang
标题的<iostream>
版本可能#include
标题为<limits>
,因此您会自动将其#include
<iostream>
{ {1}}标题。
你无能为力。这就是编译器库的实现方式。您只需添加
即可#include <limits>
到这个文件,它应该在两个平台上编译。