ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
24 апреля
902600 Топик полностью
йцукен (08.02.2019 15:45, просмотров: 180) ответил Codavr на Вот насчет читаемости мне совсем не очевидно. Хотелось бы пример замены для этого конкретного случая и пример применения в возможном контексте юзеркода. Не настаиваю, но очень хотелось бы убедиться, чиста для собственного развития.
Чиста для развития.  #define BFI(v,bf,pos,width) (v) = (v) & ~(((1<<(width))-1)<<(pos)) | ((bf)<<(pos)) #define PIN_MODE_IN 0UL #define PIN_MODE_OUT 1UL #define PIN_MODE_AF 2UL #define PIN_MODE_ANALOG 3UL enum pin_mode { MODE_IN = 0, MODE_OUT, MODE_AF, MODE_ANALOG }; void set_pin_mode_int( GPIO_TypeDef * port, int bit, int mode ) { BFI( port->MODER, mode, 2*bit, 2 ); } void set_pin_mode_enum( GPIO_TypeDef * port, int bit, enum pin_mode mode ) { BFI( port->MODER, mode, 2*bit, 2 ); } void foo() { set_pin_mode_int( GPIOA, 0, -666 ); // absurd, but compiler does not mind set_pin_mode_enum( GPIOB, 1, 1 ); // compiler error: incompatible argument type set_pin_mode_enum( GPIOC, 2, MODE_OUT ); }