我有以下代码:
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手册进行了梳理,但没有发现任何相关内容。
问题:
我正在使用的编译器: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;
}
答案 0 :(得分:9)
是的,那些隐含的转换是完全合法的。
C ++ 11 draft n3290,§4.12布尔转换:
算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为a bool类型的prvalue。零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true。类型为std :: nullptr_t的prvalue可以转换为prvalue 类型bool;结果值为false。
对这些转换的警告(对于算术类型)可能会导致整个地方发出大量警告,我认为这不会是可管理的。
在C ++ 11中,您可以使用作用域枚举来阻止隐式转换:
由于缺少从Foo
到bool
的转化而无法编译:
enum class Foo { ONE };
void tryit(bool b) { }
int main()
{
tryit(Foo::ONE);
}