Если я передаю 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
Спасибо за помощь!
Это выглядит как дизайнерское решение gcc
если мы посмотрим на Wconversion Wiki, это говорит:
[…] Опция не должна предупреждать о явных конверсиях или случаях
где значение на самом деле не может измениться, несмотря на неявное преобразование.
Если мы посмотрим на сборку для этого кода, мы можем увидеть gcc
на самом деле использует постоянное значение 15
вместо переменной, что означает, что он также выполняет постоянное сворачивание.