Я перенес код из windows (vs2010) в gcc

Его кусок выглядит так:

double r1 /* = some value */;
double r2 /* = some value */;
double diff = abs(r1-r2);
std::cerr<<  r1 << ", " << r2 << ", " << diff<< std::endl;

Он компилируется на gcc (arm-linux-gnueabihf-g ++ (Raspbian 6.3.0-18 + rpi1 + deb9u1) 6.3.0 20170516) с -Wall -Wextra без предупреждений.

Результат:

0.121, 0.0709839, 0
0.015, 0.131958, 0
0.015, 0.00799561, 0
0.21, 0.00799561, 0
0.182, 0.205994, 0
0.015, 0.00799561, 0

На окнах результат правильный. Есть двойная перегрузка функций abs.

Я не using namespace std;. Кажется, что в gcc эти перегрузки не существуют в глобальном пространстве имен.

Я не знаю, что именно говорится в стандарте, но я ожидал, по крайней мере, предупреждения о преобразовании double-> int при передаче разницы в функцию abs.

Я что-то упустил? Почему я не получаю это предупреждение?

8
vlad_tepesch 20 Дек 2018 в 18:08

2 ответа

Лучший ответ

Я думаю, вы ищете вариант компилятора -Wfloat-conversion или, в более общем смысле, -Wconversion. Затем g ++ дает мне это предупреждение:

 warning: conversion to ‘int’ from ‘double’ may alter its value [-Wfloat-conversion]
     double diff = abs(r1-r2);

Ни один из двух вариантов не включен в -Wall или -Wextra.

Он работает, пока преобразование выполняется в вашем коде, см. здесь.

4
Pates 20 Дек 2018 в 20:21

abs - это функция C, которая принимает одно целое число и возвращает другое целое число.

Вместо этого вы хотите использовать версию C ++ std::abs. Clang на самом деле предупредит об ошибке (я даже превратил ее в ошибку -Werror=absolute-value), не уверен, есть ли аналогичный флаг для gcc (не предупреждение обо всех преобразованиях, только для abs).

10
Matthieu Brucher 29 Дек 2018 в 11:53