Есть, значит, код:
#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
я проблем не замечал.
Ваш код нерабочий в обоих случаях, так как в нем (1) идут попытки использовать эффекты от непрямого включения заголовочных файлов (2) идут попытки использовать нестандартные функции. Эффекты могут рандомно различаться как у разных компиляторов, так и у одного компилятора с разными настройками. Вот например перегрузка ::std::abs(double
начиная с C++17 есть в заголовочном файле <cstdlib>
, но перегрузки ::abs(double
при этом там может и не быть.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Возможно ли подключить exe файл как dll, я слышал что dll и exe похожие форматы
Нужна идея, как реализовать такое: Есть шаблонная функция, которая регистрирует тип при запуске программыХочется сделать так, чтоб если мы в двух...