gpt4 book ai didi

c++ - 为什么当枚举或 int 值作为函数的 bool 参数传递时 gcc 不发出警告?

转载 作者:可可西里 更新时间:2023-11-01 16:05:44 30 4
gpt4 key购买 nike

我有以下代码:

typedef enum
{
FOO,
BAR,
BAZ
} foo_t;

static void afunc(bool is_it_on)
{
/* do the job */
}

int main(void)
{
afunc(BAZ);
return 0;
}

编译此代码不会生成任何警告消息,即使为编译器提供了 -Wall -Wextra 选项。我什至尝试过使用 -Wconversion 选项,但它没有效果,因为 boolenum 对于 g++ 似乎具有相同的大小。 (据我所知,enum 类型的大小未在规范中定义)

我已经梳理了 gcc 手册,但一无所获。

问题:

  • 有没有办法强制编译器在这种情况下生成警告?
  • 或者这种隐式转换是否符合 C++ 规范?

我使用的编译器:gcc 4.1.2


已编辑

结论:

对此唯一可行的解​​决方案似乎是定义一个新类型来表示 0 或 1,并使用它代替 bool

代码如下,g++ 提示类型转换:

typedef enum
{
FOO1,
FOO2
} foo_t;

typedef enum
{
MY_FALSE,
MY_TRUE
} my_bool_t;

void foo(my_bool_t a)
{
}

int main(void)
{
/*
* gcc generates an error.
* error: cannot convert ‘foo_t’ to ‘my_bool_t’
* for argument ‘1’ to ‘void foo(my_bool_t)’
*/
foo(FOO1);
return 0;
}

最佳答案

是的,那些隐式转换是完全合法的。

C++11 草案 n3290,§4.12 bool 转换:

A prvalue of arithmetic, unscoped enumeration, pointer, or pointer to member type can be converted to a prvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false; any other value is converted to true. A prvalue of type std::nullptr_t can be converted to a prvalue of type bool; the resulting value is false.

关于这些转换(对于算术类型)的警告可能会导致到处都是大量警告,我认为这是不可管理的。

在 C++11 中,您可以使用作用域枚举来防止隐式转换:

由于缺少从 Foobool 的转换,编译失败:

enum class Foo { ONE };

void tryit(bool b) { }

int main()
{
tryit(Foo::ONE);
}

关于c++ - 为什么当枚举或 int 值作为函数的 bool 参数传递时 gcc 不发出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10464291/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com