【发布时间】:2019-10-29 05:44:46
【问题描述】:
使用以下代码:
#include <stdio.h>
typedef struct
{
int APB1ENR;
int b;
int c;
} RCC_TypeDef;
typedef struct
{
int a;
int b;
int c;
} USART_TypeDef;
#define USART2_BASE 0x1000
#define USART2 ((USART_TypeDef *) USART2_BASE)
#define RCC_BASE 0x2000
#define RCC_APB1ENR_USART2EN_Pos (17U)
#define RCC_APB1ENR_USART2EN_Msk (0x1UL << RCC_APB1ENR_USART2EN_Pos)
#define RCC_APB1ENR_USART2EN RCC_APB1ENR_USART2EN_Msk
#define RCC ((RCC_Typedef *) RCC_BASE)
#define SET_BIT(REG, BIT) ((REG) |= (BIT))
#define __HAL_RCC_USART2_CLK_ENABLE() SET_BIT(RCC->APB1ENR, (RCC_APB1ENR_USART2EN))
#define UART_PERIPH USART2
#define CONCATENATE(x) // What comes here??
int main()
{
CONCATENATE(UART_PERIPH);
// | should expand to __HAL_RCC_USART2_CLK_ENABLE();
}
我们如何定义CONCATENATE(x) 宏以仅扩展一层深度。使用两级间接,它将一直扩展为指向结构的指针,我想要的是仅扩展 UART_PERIPH 一层并将其粘贴在一起以从其参数中形成一个已经存在的宏。
这可能吗?
【问题讨论】:
-
#define CONCATENATE(x) (x)或只使用UART_PERIPH。 -
你想做的事情没有多大意义。假设有某种方式使
CONCATENATE(UART_PERIPH)仅扩展到第一级,即__HAL_RCC_USART2_CLK_ENABLE()。然后呢? -
澄清一下,因为我误解了这一点:他想使用
UART_PERIPH将USART2粘合到宏中,但USART2已经被定义为其他东西。我认为这是不可能的,但我可能错了。 -
@yhyrcanus 没错。用
__HAL_RCC_宏粘合它。
标签: c gcc macros c-preprocessor