我有以下代码:
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
结论:
唯一可行的解决方案似乎是定义一个新类型来表示 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 类型的纯右值。零值、空指针值或空成员指针值将转换为 false; 任何其他值都会转换为 true。 std::nullptr_t 类型的纯右值可以转换为 类型布尔;结果值为 false。
对这些转换(对于算术类型)的警告可能会导致各处出现大量警告,我认为这是无法管理的。
在 C++11 中,您可以使用 范围枚举 来防止隐式转换:
由于缺少从
Foo
到 bool
的转换,因此无法编译:
enum class Foo { ONE };
void tryit(bool b) { }
int main()
{
tryit(Foo::ONE);
}