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

时间:2012-05-05 17:32:56

标签: c++ gcc g++ gcc-warning

我有以下代码:

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


Editted

结论:

对此唯一可行的解​​决方案似乎是定义一个表示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;
}

1 个答案:

答案 0 :(得分:9)

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

C ++ 11 draft n3290,§4.12布尔转换

  

算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为a   bool类型的prvalue。零值,空指针值或空成员指针值转换为false;   任何其他值都转换为true。类型为std :: nullptr_t的prvalue可以转换为prvalue   类型bool;结果值为false。

对这些转换的警告(对于算术类型)可能会导致整个地方发出大量警告,我认为这不会是可管理的。

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

由于缺少从Foobool的转化而无法编译:

enum class Foo { ONE };

void tryit(bool b) { }

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