2016-11-26 2 views
1

Я заметил, что 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 

ответ

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, используя <iostream>.

Вы ничего не можете поделать. Так реализуется библиотека этого компилятора. Вы можете легко:

#include <limits> 

к этому файлу и должен компилироваться на обеих платформах.

+0

Сэм Варшавчик, просто чтобы вы знали, ваш ответ был полезен, и я голосовал за него за него, а не за него. Спасибо за подсказку. –

Смежные вопросы