Возможно, это не популярное решение, но иногда полезны макросы.
#define to_bool(x) (!!(x))
Теперь мы можем безопасно получить все, что захотим, не боясь переполнить наш тип:
func(to_bool(flags & INTERESTING_FLAG));
Другой альтернативой может быть определение вашего логического типа как intmax_t
(из stdint.h
), чтобы невозможно было усечь значение до фальши.
Пока я здесь, я хочу сказать, что вы должны использовать typedef
для определения нового типа, а не #define
:
typedef short Bool; // or whatever type you end up choosing
Некоторые могут возразить, что для числовых констант следует использовать переменную const
вместо макроса:
const INTERESTING_FLAG = 0x80000000;
В целом, есть вещи получше, на которые можно потратить время. Но макросы для typedef
s немного глупы.