2016-11-26 23 views
1

我注意到,鐺++包括一個缺少的標頭 - <limits>在Mac上,而g ++在Linux上顯示它的錯誤。現在我想知道爲什麼做到這一點,而gcc沒有。而我如何強制不這樣做。爲什麼Mac上的鐺會自動包含一些缺失的標題?

這裏是一個示例代碼,在Mac上編譯通過,而不是由GCC在Linux上:

#include <iostream> 
using namespace std; 

int main() 
{ 
    cout << "int max: " << numeric_limits<int>::max() << endl; 
} 

UPD

我看着圖書館,這裏是我找到。

內部<iostream>包括<istream>,它定義了>>運算符的不同類型。 <istream>想要知道short,intstreamsize類型的限制。

鐺++使用的libC++標準庫,它使用從<limits>std::numeric_limits類模板<istream>用於這一目的。這就是包含<iostream>時自動包含此標題的原因。

克++使用的libstdC++標準庫,其使用從<ext/numeric_traits.h>代替<istream><bits/istream.tcc>)使用<limits>__gnu_cxx::__numeric_traits類模板。還有在頭這就解釋了爲什麼他們不使用<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 

回答

3

在C++中,與C不同,標準頭文件被允許爲#include其他標準頭文件。這有時會導致像你看到的那樣的神祕錯誤:一個編譯器的<iostream>包括<limits>,另一個不。解決方案是始終包含您使用的任何名稱所需的標頭。在這種情況下,這意味着在您的代碼中使用#include <limits>,即使它編譯好的編譯器也是如此。#include這個頭部已經被拉入,這沒有什麼壞處,所以兩個編譯器都可以。有時候很煩人,但事情就是這樣。

+0

我在這裏問了一個跟進問題:http://stackoverflow.com/questions/41214159/is-there-any-way-to-know-which-headers-are-automatically-included-in-c –

-1

clang版本的<iostream>標題可能#include s <limits>標題,因此您可以自動獲取它作爲#include的一部分標題。

你無能爲力。這就是編譯器庫的實現方式。您可以簡單地將

#include <limits> 

添加到此文件,並且它應該在兩個平臺上進行編譯。

+0

Sam Varshavchik,只是爲了讓你知道,你的回答很有幫助,我投了++,不是 - 。謝謝你的提示。 –

相關問題