【问题标题】:C++: need warning for: unsigned int i = -1;C++:需要警告: unsigned int i = -1;
【发布时间】:2015-11-23 13:20:54
【问题描述】:

我们的代码中有一个错误来自该行

unsigned int i = -1;

最初编写代码时,是i = 0,因此是正确的。 使用-Wall -Wextra,我有点惊讶 gcc 没有在这里警告我,因为 -1 不适合 unsigned int。

仅当打开-Wsign-conversion 时,此行才会成为警告 - 但随之而来的是许多误报。我正在使用第三方库,它使用带符号的 int 执行类似数组的操作(尽管它们不能

但是对于上面提到的任务,我得到了同样的“可能改变”警告。这不应该是“肯定会改变标志!”而不是“可能会改变”?有没有办法只针对这些“将改变”的情况发出警告,而不是针对可能的情况?

【问题讨论】:

  • 即使是明确的符号变化也经常被故意使用。例如,std::string 具有 static const size_type npos = -1;
  • -1 is used with unsigned types 因为它的结果已经被标准很好地定义了。
  • 使用无符号来确保变量不会为负是另一个错误:D
  • @AngelusMortis Nah。在这里要准确很重要:使用unsigned 来确保数字不会是负数,这绝对是正确的做法。它做的(但请参阅下面的答案)是防止赋值和负数的转换。但这些都是不同的问题。
  • @KonradRudolph meh 我刚开始学习 c++,只是想给人留下印象,我更像是个白痴:D

标签: c++ compiler-warnings gcc-warning


【解决方案1】:

用花括号初始化它:

unsigned int i{-1};

GCC 输出:

main.cpp:3:22: 错误: '-1' 的缩小转换
从 { } [-Wnarrowing] 内的 'int' 到 'unsigned int'
     无符号整数 i{-1};

请注意,它并不总是会导致错误,它可能是警告或完全禁用。您应该使用您的实际工具链尝试一下。

【讨论】:

【解决方案2】:

但是对于上面提到的任务,我得到了同样的“可能改变”警告。这不应该是“肯定会改变标志!”而不是“可能会改变”?

这很奇怪。我在 (4.6 - 5.2) 范围内测试了几个版本的 gcc,它们确实对 unsigned int i = -1; 给出了不同的警告

警告:负整数隐式转换为无符号类型[-Wsign-conversion]

也就是说,它们确实由与 may change sign 警告相同的选项控制,所以...

有没有办法只针对这些“将改变”的情况发出警告,而不是针对可能的情况?

据我所知,这是不可能的。我确信可以在编译器中实现,因此如果您想要一个单独的选项来启用将负数(在编译时已知)分配给无符号变量的警告,那么您可以提交功能请求。但是,由于将-1 分配给无符号变量是一种常见且通常完全有效的做法,我怀疑这样的功能是否会被认为非常重要。

【讨论】:

  • 好的,谢谢您的回答。事实上,警告文本是不同的。我只是在查看所有其他“可能”警告之间的错误线。那么看来我首选的解决方案是使用越来越多的auto 变量。
猜你喜欢
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多