【发布时间】: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