йцукен (08.02.2019 14:15, просмотров: 120) ответил maleon на Почему в HAL объявление взаимоисключающих GPIO_MODE реализовано через #define, а не через enum?
Потому что в голом C enum неявно преобразуеся в int, даже если его инициализировать беззнаковой константой, а для битовых масок это неудобно. Только в C++ можно сделать enum беззнаковым.
#define ONE 1
#define UONE 1U
enum { EONE = 1 };
enum { EUONE = 1U };
enum : uint32_t { CPPONE = 1 }; // error in plain C
uint32_t mask1 = ONE << 31; // warning : change of sign
uint32_t mask2 = UONE << 31; // Ok
uint32_t mask3 = EONE << 31; // warning
uint32_t mask4 = EUONE << 31; // warning
uint32_t mask5 = CPPONE << 31; // Ok