У меня есть следующий код:
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
Отредактировано
Заключение:
Единственным жизнеспособным решением этой проблемы кажется определение нового типа для представления 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;
}