Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

C++, C и функция abs

#cpp #c


Есть, значит, код:

#include 

int 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 при этом там может и не быть.

Комментариев нет:

Отправить комментарий