Jump to content

    
AlexRayne

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

Recommended Posts

 

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

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

пасиба

Share this post


Link to post
Share on other sites
7 часов назад, dxp сказал:

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

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

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

Share this post


Link to post
Share on other sites
1 minute ago, jcxz said:

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

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

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

Share this post


Link to post
Share on other sites
22 минуты назад, jcxz сказал:

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

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

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

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

Share this post


Link to post
Share on other sites
1 час назад, one_eight_seven сказал:

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

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.