隐式转换的gcc警告标志

时间:2016-03-07 11:25:44

标签: c++ gcc type-conversion gcc-warning

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

double getSomeValue()
{
    return 4.0;
}
...
std::string str;
str = getSomeValue();

正如您在此处看到的那样,很容易发现问题,但是在getSomeValue()与调用代码不在同一文件中的大型代码库中,可能很难发现此double std::string无声转换。 GCC使用-Wall -Wextra -Werror编译此代码很好(此处的示例输出,我不知道使用了哪些警告标记:http://ideone.com/BTXBFk)。

如何强制GCC针对这些危险的隐式转换发出警告?我尝试了-Wconversion,但它非常严格,并且在unsigned - 1等常见情况下会导致大多数包含的标头出错。是否有较弱版本的-Wconversion

2 个答案:

答案 0 :(得分:6)

您可以使用-Wfloat-conversion标记或更广泛的 -Wconversion

但是,请注意,使用C ++ 11 统一初始化大括号语法,您会收到“开箱即用”的警告,而不会显示-Wconversion标记; e.g:

#include <string>

double getSomeValue() {
    return 4.0;
}

int main() {   
    std::string str{ getSomeValue() }; // C++11 brace-init
}
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() };
                                   ^

答案 1 :(得分:1)

您可以使用unsigned - 1并避免-Wno-sign-conversion<div class='article'> <p>Lorem <strong>ipsum</strong> si ammet</p> </div> 的错误,例如指定的here