Перейти к содержанию
    

bad-function-cast на касте enum -> int

 

4 часа назад, Сергей Борщ сказал:

Однако, в таком случае выдается предупреждение об использовании функции без прототипа, которого достаточно для выявления подобных недоработок кода, так что смысла дополнительно включать еще и это предупреждение (а оно может быть включено только принудительно) не видно.

пасиба

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, dxp сказал:

А "целое в перечисление" - небезопасное, т.к. в перечислении просто может не оказаться соответствующего значения.

Даже не просто какого-то конкретного значения, а и сам размер его может быть недостаточным. Потому как некоторые компиляторы умеют оптимизировать хранение enum, записывая его в 1 байт.

Подозреваю, что делают они это, основываясь на максимальном значении внутри перечисления. Но не проверял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, jcxz said:

Даже не просто какого-то конкретного значения, а и сам размер его может быть недостаточным. Потому как некоторые компиляторы умеют оптимизировать хранение enum, записывая его в 1 байт.

Подозреваю, что делают они это, основываясь на максимальном значении внутри перечисления. Но не проверял.

GCC так не делает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 минуты назад, jcxz сказал:

Потому как некоторые компиляторы умеют оптимизировать хранение enum, записывая его в 1 байт.

Да, Keil uVision на ARM Compiler 6, по крайней мере, так делает.

Помню, как у себя в структурах протокола обмена заложил enum, полагая, что там будет 4-байтовый int.
А позже выяснилось, что этот элемент занимает 1 байт:scratch_one-s_head: Пришлось править на int и в нужных местах кастовать явно.

Но да, у автора топика GCC, там я не знаю, что да как.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, one_eight_seven сказал:

GCC так не делает

Делает-делает, c -fshort-enums.

1 час назад, jcxz сказал:

Даже не просто какого-то конкретного значения, а и сам размер его может быть недостаточным

К счастью, компилятор знает размер enum в точке использования и вполне может определить - влезет в него соответствующий вид целого или нет. Но он этим не занимается, как не занимается подобным и при присваивании char = int, int = long int и тому подобных. В сях (но не в плюсах) просто разрешены неявные преобразования int к enum и все.

 

Как версия: обсуждаемое предупреждение выдается потому, что если программист делает явное приведение там, где оно и так будет выполнено неявно  - то он погроммист и плохо представляет, что он делает :blum:.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...