Использование функций C в операторах препроцессора

Я программирую приложение на C ++ на чипе stm32f4, который имеет несколько IO для управления. Один из моих коллег предложил сделать заявления препроцессора для всех этих операций ввода-вывода, чтобы сделать код более читабельным.

Например:

#define FAN_ON     GPIO_SetBits(GPIOD, GPIO_Pin_0);
#define FAN_OFF    GPIO_ResetBits(GPIOD, GPIO_Pin_0);

Это нормально, а если нет, то почему?
У меня пока не так много опыта работы с микроконтроллерами, но я читал, что точки с запятой не должны использоваться в операторах препроцессора, и я также не уверен, является ли это хорошим стилем использования функций в операторах прекомпилятора?

Спасибо за помощь!

1

Решение

Это хорошо в теории, но вы правы в том, что следует избегать точек с запятой.

Лучше всего обернуть код в фиктивный цикл:

#define FAN_ON    do { GPIO_SetBits(GPIOD, GPIO_Pin_0); } while(false)

Это заставляет макрос вести себя как одно утверждение.

5

Другие решения

Чтобы ответить на ваш первый вопрос, даже если это часто встречается, использование операторов препроцессора для определения функций является довольно плохим стилем, кроме случаев, когда вам действительно нужен препроцессор. Вам действительно нужен препроцессор, когда вам нужны такие вещи, как __LINE__или приемы подстановки препроцессора, такие как вставка имени функции в char * переменная. Вы можете определить функцию void fan_on(void) а также void fan_off(void) вместо этих макросов вы можете даже объявить их static inline если вы хотите объявить их в заголовке, как если бы вы использовали макросы. Функции могут быть лучше использованы отладчиком, чем макросы, и лучше отлажены.

Как вы сказали, если вы все еще хотите использовать макросы, вы не должны использовать точки с запятой, а использовать do while(0) структура, если вы не используете макрос, если в одну строку if Блок будет выполнять только первую строку макроса.

1

По вопросам рекламы [email protected]