ре: ididak
я фиксирую код, который повреждает длинные операторы в слишком много коротких строк.
Позволяют нам столкнуться с ним: это больше не 90-е. Если Ваша компания не может позволить себе широкоэкранный LCDs для своих кодеров, необходимо получить лучшее задание:)
Да, переопределите макросы ABC
как 1 << ABC
, и вы это упростите. Объединение битовых масок вместе - очень распространенная идиома, которую узнает любой. Выявление позиций сдвига из вашего лица очень поможет.
Ваш код идет от
#define SPIE 7
#define SPE 6
#define DORD 5
#define MSTR 5
#define CPOL 4
#define CPHA 3
void init_spi() {
SPCR = (1 << SPE) | (1 << SPIE) | (1 << MSTR) | (1 << SPI2X);
}
к этому
#define BIT(n) (1 << (n))
#define SPIE BIT(7)
#define SPE BIT(6)
#define DORD BIT(5)
#define MSTR BIT(5)
#define CPOL BIT(4)
#define CPHA BIT(3)
void init_spi() {
SPCR = SPE | SPIE | MSTR | SPI2X;
}
Это предложение действительно предполагает, что определения битовых полей используются во много раз больше, чем их определений.
Мне кажется, что есть способ использовать для этого макросы с переменным числом аргументов , но я не могу представить себе ничего, что можно было бы легко использовать в качестве выражения. Однако рассмотрите возможность создания литерала массива внутри функции, генерирующей вашу константу:
#define BITS(name, ...) \
char name() { \
char[] bits = { __VA_ARGS__ }; \
char byte = 0, i; \
for (i = 0; i < sizeof(bits); ++i) byte |= (1 << bits[i]); \
return byte; }
/* Define the bit-mask function for this purpose */
BITS(SPCR_BITS, SPE, SPIE, MSTR, SPI2X)
void init_spi() {
SPCR = SPCR_BITS();
}
Если ваш компилятор хорош, он увидит, что вся функция постоянна во время компиляции, и встроит результирующее значение.
Почему бы не создать свои собственные определения в дополнение к предопределенным ...
#define BIT_TO_MASK(n) (1 << (n))
#define SPIE_MASK BIT_TO_MASK(SPIE)
#define SPE_MASK BIT_TO_MASK(SPE)
#define DORD_MASK BIT_TO_MASK(DORD)
#define MSTR_MASK BIT_TO_MASK(MSTR)
#define CPOL_MASK BIT_TO_MASK(CPOL)
#define CPHA_MASK BIT_TO_MASK(CPHA)
void init_spi() {
SPCR = SPE_MASK | SPIE_MASK | MSTR_MASK | SPI2X_MASK;
}