Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何强制宏不展开_C_Gcc_Macros_C Preprocessor - Fatal编程技术网

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
宏将其粘合。