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

172
09 марта 2018, 15:26

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

#include <iostream>
int main() {
    std::cout << abs(4.1) << std::endl;
    return 0;
}

(Специально показал инклюды, тут нет cmath).

Под рукой был лишь Windows.

Собираем с компилятором от Microsoft. Вывод:

4.1 

Собираем с g++ (MinGW). Вывод:

4

Окей, ничего не понятно.

Подключим-ка <cmath>. Ничего не меняется...

Подключаем <math.h>. Теперь все в порядке на обоих компиляторах.

Хорошо. Будем думать, что по-дефолту каким-то боком используется c-шная abs, оперирующая интами (для g++). Переписываем код:

#include <iostream>
int main() {
    std::cout << fabs(4.1) << std::endl;
    return 0;
}

Вывод cl:

4.1

Вывод g++:

А фиг вам, <cmath> подключить не хотите-ли?

Вывод g++ (после подключения <cmath>):

4.1

Ура!

Так вот, скажите:

Почему я могу использовать abs, ничего для этого не подключая - мне понятно. У меня включен <iostream>, а значит - и <stdlib.h>. Но из-за чего такие различия для разных компиляторов? Такое чувство, что компилятор от майкрософт где-то подключает <math.h>...

Да, кстати. Вопрос именно про использование c-функций abs. С std::abs я проблем не замечал.

Answer 1

Ваш код нерабочий в обоих случаях, так как в нем (1) идут попытки использовать эффекты от непрямого включения заголовочных файлов (2) идут попытки использовать нестандартные функции. Эффекты могут рандомно различаться как у разных компиляторов, так и у одного компилятора с разными настройками. Вот например перегрузка ::std::abs(double начиная с C++17 есть в заголовочном файле <cstdlib>, но перегрузки ::abs(double при этом там может и не быть.

READ ALSO
Как убрать легенду у графиков qt QChart?

Как убрать легенду у графиков qt QChart?

Как убрать легенду на графиках QChart?

142
C++ Переместить символ в начало строки

C++ Переместить символ в начало строки

Вводим 2 строкиНапример 'abcde' и 'deabc'

155
Как подключить exe как dll

Как подключить exe как dll

Возможно ли подключить exe файл как dll, я слышал что dll и exe похожие форматы

175
Шаблонная (или нет) функция, которую можно вызвать только один раз

Шаблонная (или нет) функция, которую можно вызвать только один раз

Нужна идея, как реализовать такое: Есть шаблонная функция, которая регистрирует тип при запуске программыХочется сделать так, чтоб если мы в двух...

128