编译器不会警告“int in bool context”

问题描述 投票:0回答:1

在我的项目中,我将许多函数的返回值从

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 个调用。所以在没有任何警告的情况下我很容易错过一些......

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

c++ compiler-errors g++ clang
1个回答
1
投票

几个想法:

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

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

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

  1. 另请参阅

C++ 基元隐式转换的警告或错误

关于原始转换。

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

希望这能让你有所收获。

© www.soinside.com 2019 - 2024. All rights reserved.