Почему gcc не предупреждает, когда значение enum или int передается как аргумент функции, #39; который является логическим?

У меня есть следующий код:

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


Отредактировано

Заключение:

Единственным жизнеспособным решением этой проблемы кажется определение нового типа для представления 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;
}
10
задан Young-hwi 5 May 2012 в 18:35
поделиться