为什么当 enum 或 int 值作为 bool 函数参数传递时 GCC 不发出警告?

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

我有以下代码:

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
选项,但没有效果,因为
bool
enum
对于 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++ gcc g++ gcc-warning
1个回答
9
投票

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

C++11 草案 n3290,§4.12 布尔转换

算术、无作用域枚举、指针或指向成员类型的指针的纯右值可以转换为 bool 类型的纯右值。零值、空指针值或空成员指针值将转换为 false; 任何其他值都会转换为 true。 std::nullptr_t 类型的纯右值可以转换为 类型布尔;结果值为 false。

对这些转换(对于算术类型)的警告可能会导致各处出现大量警告,我认为这是无法管理的。

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

由于缺少从

Foo
bool
的转换,因此无法编译:

enum class Foo { ONE };

void tryit(bool b) { }

int main()
{
    tryit(Foo::ONE);
}
© www.soinside.com 2019 - 2024. All rights reserved.