我有以下代碼:爲什麼當一個枚舉或int值作爲一個函數的bool參數傳遞時,gcc不會發出警告?
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
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++」類型系統只適用於用戶定義的類型,對於內置類型它總是很糟糕。其C遺產的後果。 –
是的,它似乎是如此。我決定typedef一個專門用於表示0或1的新類型,並用它來代替bool,這似乎是爲了表示_true_或_false_。 – orchistro