【发布时间】:2012-05-05 17:32:55
【问题描述】:
我有以下代码:
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++ 的类型系统只适用于用户定义的类型,而对于内置类型,它总是很糟糕。其 C 遗产的后果。
-
是的,看起来是这样。我决定 typedef 一个新类型,专用于仅表示 0 或 1,并使用它来代替 bool,这似乎是为了表示 true 或 false。跨度>
标签: c++ gcc g++ gcc-warning