为什么没有g ++ -Wconversion在double为常数时警告double to long int的转换?

时间:2014-07-10 13:13:06

标签: c++ gcc g++ implicit-conversion

如果我将double传递给需要很长的函数,g ++会警告转换问题,但是如果我将const double传递给需要很长的函数,那么g ++很高兴。警告如下:

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

我想g ++给我一个警告,无论是传递double还是const double。我该怎么做?

我有makefile和一些你可以运行的代码。我想尽可能多地打开警告,但也许有人会暗中关闭另一个警告?我不确定。

这是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

感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

如果我们查看Wconversion wiki,这看起来像gcc的设计决定,它说:

  

[...]该选项不应警告显式转换或案例   尽管存在隐式转换,但实际上值不会发生变化。

如果我们查看此代码的程序集,我们可以看到gcc实际上使用15的常量值而不是变量,这意味着它也执行常量折叠。