LINUX.ORG.RU

Enum и битовые операции

 ,


0

1

Не нашел документации на тему «почему так делать нельзя»:

typedef enum
{
  F1 = 1,
  F2 = 2,
  F3 = 4
} FT;

FT t;

t = F1 | F3;

if (t & (F2 | F3))
  break;

Если действительно нельзя (хотя компилятор и cppcheck не ругаются), то как можно, чтобы в аргументах функции не висел int?

★★

Последнее исправление: cetjs2 (всего исправлений: 1)

enum имеет значение строго из определённого списка. Битовые операции множество значений, естественно, значительно расширяют. Так что результат - int, но никак не enum.

PS. А если хочется наглядности в сигнатуре функции, используй что-то типа typedef int FT_flags_t. В C, разумеется, безо всяких статических проверок. В C++ действительно можно сделать аналог QFlags, причем так чтобы никто на него не ругался.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 2)
Ответ на: комментарий от yoghurt

Там 1) С++, 2) В Qt много извращений, PVS и cppcheck плачут кровавыми слезами.

sambist ★★
() автор топика
Ответ на: комментарий от four_str_sam

А почему нельзя?

Ну вот на работе мне кричат, что нельзя, тут вот slovazap говорит что нельзя.

sambist ★★
() автор топика

Можно пока значения до знакового бита не дойдут, но в аргументах ф-ии всё равно должен быть численный тип, ниже уже объяснили почему.

mashina ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.