Я программирую приложение на C ++ на чипе stm32f4, который имеет несколько IO для управления. Один из моих коллег предложил сделать заявления препроцессора для всех этих операций ввода-вывода, чтобы сделать код более читабельным.
Например:
#define FAN_ON GPIO_SetBits(GPIOD, GPIO_Pin_0);
#define FAN_OFF GPIO_ResetBits(GPIOD, GPIO_Pin_0);
Это нормально, а если нет, то почему?
У меня пока не так много опыта работы с микроконтроллерами, но я читал, что точки с запятой не должны использоваться в операторах препроцессора, и я также не уверен, является ли это хорошим стилем использования функций в операторах прекомпилятора?
Спасибо за помощь!
Это хорошо в теории, но вы правы в том, что следует избегать точек с запятой.
Лучше всего обернуть код в фиктивный цикл:
#define FAN_ON do { GPIO_SetBits(GPIOD, GPIO_Pin_0); } while(false)
Это заставляет макрос вести себя как одно утверждение.
Чтобы ответить на ваш первый вопрос, даже если это часто встречается, использование операторов препроцессора для определения функций является довольно плохим стилем, кроме случаев, когда вам действительно нужен препроцессор. Вам действительно нужен препроцессор, когда вам нужны такие вещи, как __LINE__
или приемы подстановки препроцессора, такие как вставка имени функции в char *
переменная. Вы можете определить функцию void fan_on(void)
а также void fan_off(void)
вместо этих макросов вы можете даже объявить их static inline
если вы хотите объявить их в заголовке, как если бы вы использовали макросы. Функции могут быть лучше использованы отладчиком, чем макросы, и лучше отлажены.
Как вы сказали, если вы все еще хотите использовать макросы, вы не должны использовать точки с запятой, а использовать do while(0)
структура, если вы не используете макрос, если в одну строку if
Блок будет выполнять только первую строку макроса.