将宏与标记粘贴运算符一起使用
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_P
和 A_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);
我在使代码更通用时遇到问题,我想用宏替换硬编码值,但我遇到了这个问题:
原代码:
#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_P
和 A_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);