变体宏不起作用

-3 c macros variadic-macros

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

标识符"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
Run Code Online (Sandbox Code Playgroud)

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

unw*_*ind 5

您必须记住,预编译器事件在编译代码之前发生,并且严格地是纯文本替换.

因此,取决于由于运行时循环而具有不同值的变量是没有意义的,并且不起作用.

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

static const struct {
  const GPIO_TypeDef *port;
  uint32_t            pin;
} buttons[] = {
  { GPIOB, GPIO_PIN_8 },
  { GPIOB, GPIO_PIN_9 },
  ...
};
Run Code Online (Sandbox Code Playgroud)

然后迭代数组中的数据:

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

  • 你开始[听起来很XY](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem),为什么宏是这个有趣的部分? (3认同)