#cpp #c
Есть, значит, код: #includeint main() { std::cout << abs(4.1) << std::endl; return 0; } (Специально показал инклюды, тут нет cmath). Под рукой был лишь Windows. Собираем с компилятором от Microsoft. Вывод: 4.1 Собираем с g++ (MinGW). Вывод: 4 Окей, ничего не понятно. Подключим-ка . Ничего не меняется... Подключаем . Теперь все в порядке на обоих компиляторах. Хорошо. Будем думать, что по-дефолту каким-то боком используется c-шная abs, оперирующая интами (для g++). Переписываем код: #include int main() { std::cout << fabs(4.1) << std::endl; return 0; } Вывод cl: 4.1 Вывод g++: А фиг вам, подключить не хотите-ли? Вывод g++ (после подключения ): 4.1 Ура! Так вот, скажите: Почему я могу использовать abs, ничего для этого не подключая - мне понятно. У меня включен , а значит - и . Но из-за чего такие различия для разных компиляторов? Такое чувство, что компилятор от майкрософт где-то подключает ... Да, кстати. Вопрос именно про использование c-функций abs. С std::abs я проблем не замечал.
Ответы
Ответ 1
Ваш код нерабочий в обоих случаях, так как в нем (1) идут попытки использовать эффекты от непрямого включения заголовочных файлов (2) идут попытки использовать нестандартные функции. Эффекты могут рандомно различаться как у разных компиляторов, так и у одного компилятора с разными настройками. Вот например перегрузка ::std::abs(double начиная с C++17 есть в заголовочном файле, но перегрузки ::abs(double при этом там может и не быть.
Комментариев нет:
Отправить комментарий