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,int和streamsize类型的限制。
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)
在 C++ 中,与 C 不同,标准头文件允许用于#include其他标准头文件。这有时会导致像您看到的那样的神秘错误:一个编译器<iostream>包含<limits>而另一个不包含。解决方案是始终包含您使用的任何名称所需的标头。在这种情况下,这意味着#include <limits>在您的代码中,即使它与一个编译器一样可以正常编译。#include已经被拉入的头文件没有坏处,所以这两个编译器都可以。有时很烦人,但事情就是这样。
| 归档时间: |
|
| 查看次数: |
897 次 |
| 最近记录: |