Почему g ++ -Wconversion не предупреждает о преобразовании double в long int, когда double является константой?

Если я передаю double в функцию, требующую long, g ++ предупреждает о проблеме преобразования, но если я передаю const double в функцию, требующую long, g ++ рад. Предупреждение следующее:

warning: conversion to ‘long int’ from ‘double’ may alter its value [-Wconversion]

Я хотел бы, чтобы g ++ предупредил меня, передал ли я double или const double. Как бы я это сделал?

У меня есть make-файл и код, который вы можете запустить. Мне нравится включать как можно больше предупреждений, но, возможно, одно неявно отключает другое? Я не уверен.

Вот Makefile:

WARNOPTS=-Wall -Wextra -pedantic \
-Wdouble-promotion -Wformat=2 -Winit-self \
-Wmissing-include-dirs -Wswitch-default -Wswitch-enum \
-Wundef -Wunused-function -Wunused-parameter \
-Wno-endif-labels -Wshadow \
-Wpointer-arith \
-Wcast-qual -Wcast-align \
-Wconversion \
-Wsign-conversion -Wlogical-op \
-Wmissing-declarations -Wredundant-decls \
-Wctor-dtor-privacy \
-Wnarrowing -Wnoexcept -Wstrict-null-sentinel \
-Woverloaded-virtual \
-Wsign-compare -Wsign-promo -Weffc++BUILD := develop
cxxflags.develop := -g $(WARNOPTS)
cxxflags.release :=
CXXFLAGS := ${cxxflags.${BUILD}}

foo: foo.cpp
g++ $(CXXFLAGS) -o $@ $^

Вот foo.cpp:

// foo.cpp

#include <iostream>
#include <string>

using namespace std;

const double WAITTIME = 15;  // no warning on function call
//double WAITTIME = 15;  // warning on function call

bool funcl( long time);bool funcl( long time ) {
cout << "time = " << time << endl;
return true;
}
int main() {
string rmssg;

funcl( WAITTIME );
return 0;
}

Это версия g ++, которую я использую:

g++ --version
g++ (Debian 4.7.2-5) 4.7.2

Спасибо за помощь!

3

Решение

Это выглядит как дизайнерское решение gcc если мы посмотрим на Wconversion Wiki, это говорит:

[…] Опция не должна предупреждать о явных конверсиях или случаях
где значение на самом деле не может измениться, несмотря на неявное преобразование.

Если мы посмотрим на сборку для этого кода, мы можем увидеть gcc на самом деле использует постоянное значение 15 вместо переменной, что означает, что он также выполняет постоянное сворачивание.

4

Другие решения


По вопросам рекламы ammmcru@yandex.ru