Я заметил, что clang ++ содержит отсутствующий заголовок - <limits>
на Mac, а g ++ показывает ошибки об этом в Linux. Теперь я задаюсь вопросом, почему clang делает, и gcc нет. И как я могу заставить clang не делать этого.Почему clang на Mac автоматически включает некоторые отсутствующие заголовки?
Вот пример кода, который собирает на лязгом на Mac, но не НКУ на Linux:
#include <iostream>
using namespace std;
int main()
{
cout << "int max: " << numeric_limits<int>::max() << endl;
}
UPD
Я посмотрел в библиотеки и вот что я найденный.
Внутренний номер <iostream>
содержит <istream>
, что определяет >>
оператор для разных типов. <istream>
хочет знать лимиты для short
, int
и streamsize
типов.
лязг ++ использует LibC++ стандартную библиотеку, которая использует std::numeric_limits
шаблон класса из <limits>
в <istream>
для этой цели. Вот почему этот заголовок включается автоматически, когда включен <iostream>
.
г ++ использует libstdC++ стандартную библиотеку, которая использует шаблон __gnu_cxx::__numeric_traits
класса из <ext/numeric_traits.h>
вместо использования <limits>
в <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
Я задал следующий вопрос здесь: http://stackoverflow.com/questions/41214159/is-there-any-way-to-know-which-headers-are-automatically-included-in-c –