【问题标题】:Compiler not warns about "int in bool context"编译器不会警告“布尔上下文中的 int”
【发布时间】:2022-01-12 01:14:04
【问题描述】:

在我的项目中,我将函数的许多返回值从 bool 更改为枚举值
问题在于集成。编译器不会警告我函数的错误使用。

我正在使用 g++(使用 c++14)和“-Wall -Wextra -Werror”标志

让我们看一个产生警告的例子:

typedef enum {
    VALUE_1,
    VALUE_2,
    VALUE_3
} MY_ENUM;

bool bar() {
    return VALUE_3;
}

所以在本例中,我们返回 VALUE_3 并正确获取错误:error: enum constant in boolean context [-Werror=int-in-bool-context]

但是,如果我们稍微改变一下这个例子,编译器不会产生任何错误:

typedef enum {
    VALUE_1,
    VALUE_2,
    VALUE_3
} MY_ENUM;

MY_ENUM foo() {
    return VALUE_3;
}

bool bar() {
    return foo();
}

当然,我知道 enum 是 int 类型,bool 是 int 类型,所以编译器可以处理它。但至少我期待某种警告?

也尝试过 clang,两个示例的结果相同。
我的项目中的问题是我更改了约 150 个函数的返回值,并且有约 300 个调用。所以没有任何警告我很容易错过一些......

我可以让它对我大喊大叫吗?

【问题讨论】:

  • 为什么不使用enum class
  • @Sean 客户端约束,header 必须是 C。所以枚举必须是 C 风格
  • 客户端需要C风格的头文件,但是你呢?您可以使用enum class,清理所有编译器错误,然后在编译器为您找到所有用法后返回到普通的旧enum
  • 枚举器仅在 C 中属于 int 类型。另外,警告明确提到“常量”:它是关于无用地使用枚举器(其值既不是 0 也不是 1)其中 false 或 @ 987654330@ 会起作用,而不是关于一般的布尔转换(这被广泛认为是惯用的)。

标签: c++ compiler-errors g++ clang


【解决方案1】:

几个想法:

  1. 在这里查看一些不同的标志:

https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

添加 -Wextra。该网站表示并非所有警告都是由 -Wall 明确添加的,可能需要明确添加。请注意,枚举的隐式转换仅适用于 c。看起来你标记了 c++。

  1. 另见

Warnings or errors for C++ implicit conversion of primitives

关于原始转换。

  1. 如果您想真正具体地使用枚举值,枚举类将不会转换为 int,因此会在 bool 上下文中出错。

希望这能让你有所收获。

【讨论】:

  • 试过-Wextra,没用。在第二个链接中没有看到任何相关答案
  • -Wall 应该打开它,但明确尝试“-Wint-in-bool-context”而不是-Wall。这正是你的标题所描述的。否则,请尝试强烈键入您的枚举。不应将强类型枚举分配给 bool 或在任何 bool 上下文中使用它。您需要做的就是更改枚举示例 {};枚举类示例 {};
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
  • 2011-05-09
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多