隐式转换的gcc警告标志

Mir*_*pas 12 c++ gcc type-conversion gcc-warning

我最近在下一个类似的上下文中遇到了一个错误:

double getSomeValue()
{
    return 4.0;
}
...
std::string str;
str = getSomeValue();
Run Code Online (Sandbox Code Playgroud)

正如您在这里看到的那样很容易发现问题,但是在一个大型代码库中getSomeValue(),调用代码不在同一个文件中,可能很难发现这doublestd::string静默转换.GCC编译这段代码很好-Wall -Wextra -Werror(这里的示例输出,我不知道使用了什么警告标志:http://ideone.com/BTXBFk).

我如何强制GCC为这些危险的隐式转换发出警告?我试过了-Wconversion,但它非常严格,它会导致大多数包含标题的错误,例如unsigned - 1.是否有较弱的版本-Wconversion

Mr.*_*C64 7

你可以使用-Wfloat-conversion旗帜,或更广泛的-Wconversion.

但是,请注意,使用C++ 11 统一初始化大括号语法,您会得到一个"开箱即用"的警告,没有-Wconversion标志; 例如:

#include <string>

double getSomeValue() {
    return 4.0;
}

int main() {   
    std::string str{ getSomeValue() }; // C++11 brace-init
}
Run Code Online (Sandbox Code Playgroud)
C:\Temp\CppTests>g++ -std=c++11 test.cpp
test.cpp: In function 'int main()':
test.cpp:8:35: warning: narrowing conversion of 'getSomeValue()' from 'double' t
o 'char' inside { } [-Wnarrowing]
     std::string str{ getSomeValue() };
                                   ^
Run Code Online (Sandbox Code Playgroud)