将宏与标记粘贴运算符一起使用

Use macro with token-pasting operator

我在使代码更通用时遇到问题,我想用宏替换硬编码值,但我遇到了这个问题:

原代码:

#define io_dir_in(port, pin) NRF_P##port->PIN_CNF[pin] = (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) + (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)

io_dir_in(0, 0);

我补充说:

#define A_Port  0
#define A_Pin   0

并替换为:

io_dir_in(A_Port, A_Pin);

但我收到错误 identifer "NRF_PA_Port" is undefined,因为 NRF_PA_Port 正在连接。
无论如何让它工作?

问题是“标记连接”是在标记扩展之前完成的。您需要在两者之间添加额外的扩展步骤。

#define io_dir_in_impl(port, pin) NRF_P##port->PIN_CNF[pin] = (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) + (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
#define io_dir_in(port, pin) io_dir_in_impl(port, pin) 

现在 before io_dir_in_impl() 被扩展了,它的所有参数都被扩展了。因此 A_Port 将被替换为 0.

通过此调整 io_dir_in(A_Port, A_Pin); 扩展为:

NRF_P0->PIN_CNF[0] = (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) + (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos);