You*_*hwi 10 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;
}
Run Code Online (Sandbox Code Playgroud)
即使-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;
}
Run Code Online (Sandbox Code Playgroud)
是的,那些隐含的转换是完全合法的.
C++ 11 draft n3290,§4.12 布尔转换:
算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为bool类型的prvalue.零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true.类型为std :: nullptr_t的prvalue可以转换为bool类型的prvalue; 结果值为false.
这些转换的警告(对于算术类型)可能会导致整个地方发出大量警告,我认为这不会是可管理的.
在C++ 11中,您可以使用作用域枚举来阻止隐式转换:
这不能编译缺乏从转换Foo到bool:
enum class Foo { ONE };
void tryit(bool b) { }
int main()
{
tryit(Foo::ONE);
}
Run Code Online (Sandbox Code Playgroud)