[英]Why does gcc not warn when an enum or int value is passed on as a function's argument which is bool?
我有以下代碼:
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;
}
是的,那些隱含的轉換是完全合法的。
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.