【问题标题】:How to get the compiler to warn that this is an invalid bool?如何让编译器警告这是一个无效的布尔值?
【发布时间】:2019-09-28 08:32:16
【问题描述】:

我们刚刚被一个拼写错误:“constexpr bool maxDistance=10000;

gcc 和 clang 都在没有警告的情况下编译它。

这里真正的错误是变量不应该是 bool 类型,而应该是整数类型。

我们如何确保我们将来会收到编译器警告?

#include <iostream>

constexpr bool number = 1234;
int main(int argc, char* argv[])
{
    std::cout << number + 10000 << std::endl; // prints 10001.
    return number;
}

这里的错误是变量声明了错误的类型,但是clang和gcc都没有给出警告。

gcc -Wall -std=c++14 test.cpp -lstdc++
clang -Wall -std=c++14 test.cpp -lstdc++

(使用 gcc 5.4.0 和 clang 3.8.0)

注意:我已经了解了一个可能的编译标志:-Wint-in-bool-context 但是这似乎没有在我使用的版本 (5.4.0) 和 clang (3.8.0) 中实现。

这是正确的方法吗?

【问题讨论】:

  • 我认为在clang和gcc中都没有bool number = 1234;的警告。
  • 将整数分配给布尔值是合法且定义明确的操作,因此编译器不会发出警告。如果需要,请找到支持该选项的静态分析工具
  • MSVC 给出警告:“隐式转换……可能的信息丢失。”
  • @RemyLebeau:对于 OP 的情况,很明显,这是一个错误。没有人会用整数文字初始化 bool

标签: c++ boolean compiler-warnings constexpr


【解决方案1】:

你应该使用直接列表初始化语法,它禁止缩小:

constexpr bool number{1234}; // error: narrowing conversion of '1234' from 'int' to 'bool' [-Wnarrowing]

【讨论】:

  • 为什么这被否决了?它似乎有效:test.cpp:3:24: 错误:常量表达式计算为 1234,不能缩小为类型 'bool' [-Wc++11-narrowing] constexpr bool number {1234};
【解决方案2】:

我发现 gcc 有一个标志 '-Wint-in-bool-context' 但这似乎没有在我使用的版本 (5.4.0) 和 clang (3.8.0) 中实现)。

这是正确的方法吗?

【讨论】:

  • “警告在预期使用布尔值的地方可疑使用整数值”。我会说你的情况肯定满足了这一点,所以 gcc 应该产生一个警告。但它不会产生。也许您可以将此问题作为对 gcc 开发人员的增强提交。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
  • 2018-12-06
  • 2023-01-29
  • 2021-12-07
  • 1970-01-01
相关资源
最近更新 更多