【问题标题】:gcc warning flags for implicit conversions用于隐式转换的 gcc 警告标志
【发布时间】:2016-03-07 11:25:43
【问题描述】:

我最近遇到了一个与下一个类似的错误:

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

如您所见,这里很容易发现问题,但是在getSomeValue() 与调用代码不在同一个文件中的大型代码库中,可能很难发现doublestd::string 的这个问题转换。 GCC 可以使用 -Wall -Wextra -Werror 很好地编译此代码(此处的示例输出,我不知道使用了哪些警告标志:http://ideone.com/BTXBFk)。

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

【问题讨论】:

  • 其实是doublecharstring转换。第一个可以被-Wfloat-conversion 捕获,-Wconversion 也启用了
  • @Revolver_Ocelot 谢谢,这个标志似乎是我正在搜索的标志。不幸的是,它在 GCC 4.8.2 中不可用
  • @DieterLücking 我在问题中指定我不能使用 -Wconversion 因为我收到很多 unsigned - 1 like 许多包含标题中的构造的错误。
  • 当它实际上没有使用大括号初始化时,为什么要标记大括号初始化(如果是这样就没有问题,因为大括号初始化可以防止缩小转换)
  • @Destructor 因为没有构造函数采用单个整数值(最接近的一个采用 char size_t),但是有一个赋值运算符采用单个 char。

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


【解决方案1】:

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

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

#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() };
                                   ^

【讨论】:

  • 这对 str = getSomeValue(); 没有帮助,它是赋值而不是初始化(可能在 OP 的代码中,赋值是在变量已经被使用后的一段时间内进行的,所以它可以t 替换为初始化)
  • @M.M:可能在这些情况下,这样的事情可能适用于 OP:str = std::string{ getSomeValue() };。无论如何,我认为使用-Wconversion 是一个不错的选择。
【解决方案2】:

您可以使用-Wconversion 并避免unsigned - 1-Wno-sign-conversion 的错误,如指定的here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    相关资源
    最近更新 更多