GCC странное поведение на функцию пресса - PullRequest
0 голосов
/ 20 декабря 2018

Я портировал некоторый код из 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 эти перегрузки не существуют в глобальном пространстве имен.

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

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

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

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

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

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

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

0 голосов
/ 20 декабря 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...