我想做的是使用宏访问代码。但是编译器给我这个错误


  标识符“ BUTTON___button”未定义


#define BUTTON_1                HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8)
#define BUTTON_2                HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9)
#define BUTTON_3                HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4)
#define BUTTON_4                HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5)
#define BUTTON_5                HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)
#define BUTTON_6                HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_14)
#define BUTTON_7                HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_12)
#define BUTTON_8                HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_11)
#define BUTTON_9                HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_15)
#define BUTTON_10               HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_0)
#define BUTTON_11               HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_10)
#define BUTTON_12               HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_15)
#define BUTTON_13               HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)
#define BUTTON_14               HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_2)
#define BUTTON_15               HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_11)
#define BUTTON_16               HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)
#define BUTTON_17               HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_0)
#define BUTTON_18               HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_1)
#define BUTTON_19               HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_5)
#define BUTTON_20               HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4)

#define BUTTON(...)             BUTTON_##__VA_ARGS__


for(uint8_t _button = 1; _button < 21; _button++)
    BUTTON(__button) //=> This should give me BUTTON(1) , BUTTON(2) ... each iteration.But not working


通过使用可变参数宏,我可以获得我想要的吗?

最佳答案

您必须记住,预处理程序是在代码编译之前发生的,并且严格来说是纯文本的替换。

因此,依赖因运行时循环而具有不同值的变量是没有意义的,而且行不通。

正确的方法是将端口地址(GPIOA等)与每个端口的相应引脚一起放在一个数组中:

static const struct {
  const GPIO_TypeDef *port;
  uint32_t            pin;
} buttons[] = {
  { GPIOB, GPIO_PIN_8 },
  { GPIOB, GPIO_PIN_9 },
  ...
};


然后遍历数组中的数据:

for (size_t i = 0; i < sizeof buttons / sizeof *buttons; ++i)
{
  if (HAL_GPIO_ReadPin(buttons[i].port, buttons[i].pin))
  {
     ...
  }
}

关于c - 可变参数宏无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49445834/

10-15 06:12