Почему GCC не предупреждает, когда значение enum или int передается в качестве аргумента функции, который является логичC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему GCC не предупреждает, когда значение enum или int передается в качестве аргумента функции, который является логич

Сообщение Anonymous »

У меня есть следующий код:
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 (13 февраля 2007 г.)
Вывод:
Похоже, что единственным жизнеспособным решением этой проблемы является определение нового типа для представления 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;
}


Подробнее здесь: https://stackoverflow.com/questions/104 ... ctions-arg
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»