Mam następujący kod:Dlaczego gcc nie ostrzega, gdy wartość enum lub int jest przekazywana jako argument funkcji, który jest 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;
}
Kompilacja ten kod nie generuje żadnego ostrzeżenia, nawet z -Wall -Wextra
opcji podanych do kompilatora. Próbowałem nawet z opcją -Wconversion
, która nie przyniosła skutku, ponieważ bool
i enum
wydawały się być tego samego rozmiaru dla g ++. (rozmiar enum
typu nie jest zdefiniowany w specyfikacji o ile mi wiadomo)
Przeszedłem przez podręcznik GCC i nic nie znalazłem.
Pytania:
- Czy istnieje sposób zmusić kompilator generuje ostrzeżenie w takich przypadkach?
- A może to, że ten niejawny casting jest zgodny ze specyfikacją C++?
Compiler, że używam: gcc 4.1.2
editted
Wniosek:
Jedynym realnym rozwiązaniem wydaje się zdefiniowanie nowego typu do reprezentowania 0 lub 1 i użyj go zamiast bool
.
Kod będzie jak po, i g ++ narzeka typu konwersji:
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;
}
Ponieważ C++” system typu jest dobry tylko dla typów zdefiniowanych przez użytkownika, dla typów wbudowanych niezmiennie jest do bani. Konsekwencja dziedzictwa C. –
Tak, wydaje się, że tak.Postanowiłem napisać nowy typ dedykowany do reprezentowania tylko 0 lub 1 i używać go zamiast bool, który wydaje się być przeznaczony do wyrażenia _true_ lub _false_. – orchistro