C 如何强制宏不展开
使用以下代码:C 如何强制宏不展开,c,gcc,macros,c-preprocessor,C,Gcc,Macros,C Preprocessor,使用以下代码: #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
#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();
}
#包括
类型定义结构
{
int APB1ENR;
int b;
INTC;
}RCC_TypeDef;
类型定义结构
{
INTA;
int b;
INTC;
}USART_TypeDef;
#定义USART2_基0x1000
#定义USART2((USART_TypeDef*)USART2_基)
#定义RCC_基0x2000
#定义RCC\u APB1ENR\u USART2 EN\u位置(17U)
#定义RCC_APB1ENR_USART2EN_Msk(0x1UL APB1ENR,(RCC_APB1ENR_USART2EN))
#定义UART_外围用户2
#定义连接(x)//这里是什么??
int main()
{
连接(UART_PERIPH);
//|应扩展到uu HAL_RCC_USART2_CLK_ENABLE();
}
我们如何定义CONCATENATE(x)
宏以仅扩展一层深度。使用两个级别的间接寻址,它会一直扩展到指向结构的指针,我想要的是只扩展一个层,然后将它粘贴到一起,从它的参数中形成一个已经存在的宏
这是可能的吗?我们如何定义CONCATENATE(x)宏以仅扩展一层深度。。。这可能吗?
不,这是你们有的。当宏调用发生时,第一步是参数替换(a.s.;6.10.3.1);在该步骤中,如果宏的替换列表中提到了相应的参数,并且所述参数未涉及字符串化或粘贴,则会对参数中的标记进行评估。由此产生的扩展替换替换列表中的所述参数。接下来,不按特定顺序应用字符串化/粘贴。最后,重新扫描和进一步替换(r.a.f.r;6.10.3.4p1),在此期间扫描生成的替换列表本身;在此扫描过程中,宏的名称为“painted blue”(6.10.3.4p2;“blue paint”未提及名称,但用于此),这意味着如果遇到宏,它将不会进一步扩展
让我们从这个角度来看
UART\u PERIPH
是一个标识符。它要么在某些上下文中被识别为宏(即将触发宏调用),要么不会。上下文是否在a.s.或r.a.f.r.期间并不重要。;如果调用了它,则调用涉及r.a.f.r.(不需要a.s.,因为它类似于对象)。因此,调用包括获取USART2
并重新扫描它。唯一可能不扩展的方法是不将此标识符识别为宏,但由于它当前定义为宏,因此唯一可能的方法是将此标识符涂成蓝色。这是不可能的(至少在预期的上下文中是不可能的),因为要实现这一点,USART2
必须进行扩展,而到那时,您已经在注入您不想要的令牌。#定义串联(x)(x)
或只使用UART\u PERIPH
。您想要做的事情没有多大意义。让我们假设有某种方式使串联(UART\u PERIPH)
只扩展到第一级,即\uuuu HAL\urcc\uusart2\u CLK\u ENABLE()
。然后呢?澄清一下,因为我误解了这一点:他想使用UART\u PERIPH
将USART2
粘合到宏中,但是USART2
已经被定义为其他东西。我认为这是不可能的,但我可能是错的。@yhyrcanus。用\uuu HAL\urcc\uu
宏将其粘合。