【发布时间】:2015-02-26 10:58:33
【问题描述】:
我正在使用 GCC 为 ARM 进行编码,需要将 (##) 名称与 a 定义连接起来,如下所示:
#define LCD_E_PORT GPIOC
...
#define RCC_PORT(x) (RCC_APB2Periph_ ## (x)) // ???
...
这样在RCC_PORT(LCD_E_PORT) 之后我会得到RCC_APB2Periph_GPIOC。重要的是要说,LCD_E_PORT 和 RCC_APB2Periph_GPIOC 不是字符串,而是一些低级系统定义的指针(访问它们的处理器内存映射)。
所有这一切的重点是拥有一个宏,它可以处理多个端口定义。
有解决办法吗?
我正在使用 arm-none-eabi-gcc。
【问题讨论】:
-
如果你尝试
#define RCC_PORT(x) RCC_APB2Periph_##x会发生什么? -
例如:
RCC_PORT(LCD_E_PORT)会导致RCC_APB2Periph_LCD_E_PORT所以是错误的。我也尝试过双重定义,我的意思是:#define RCC_PORT1(x) RCC_PORT(x),但在RCC_PORT1(LCD_E_PORT)之后出现RCC_APB2_Periph_ and "(" don't give a valid token的错误,因为正如我所说,GPIOx 是(u32 *) ptr。就是这样或者不扩展宏,或者将宏扩展为最终定义……我需要的只是中间的定义。
标签: c c-preprocessor