簡體   English   中英

如何強制宏不展開

[英]How to force macro to not expand

使用以下代碼:

#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一層並將其粘貼到一起,以根據其參數形成一個已經存在的宏。

這可能嗎?

我們如何定義CONCATENATE(x)宏以僅擴展一層深度。 ... 這可能嗎?

否。這是您所擁有的。 發生宏調用時,第一步是參數替換(如6.10.3.1); 在該步驟中,如果在宏的替換列表中提到了它們的相應參數,而字符串或粘貼中沒有提及,則對參數中的標記進行評估。 生成的擴展將替換替換列表中的所述參數。 接下來,不按特定順序應用串化/粘貼。 最后,進行重新掃描並進行進一步替換(草稿; 6.10.3.3.4p1),在此期間,將掃描生成的替換列表本身。 在此掃描期間,宏的名稱為“塗成藍色”(6.10.3.4p2;“藍色塗成”未按名稱提及,但是技術術語 ),這意味着如果遇到該宏,它將不會進一步擴展。

因此,讓我們從這種角度來看它。 UART_PERIPH是一個標識符。 在某些情況下,它將被識別為宏(即,將觸發宏調用),或者不會。 上下文是在as還是rafr期間都沒有關系; 如果調用此方法,則調用涉及rafr(之所以不這樣,是因為它類似於對象)。 因此,調用涉及獲取USART2並對其進行重新掃描。 不擴展USART2的唯一可能方法是不將該標識符識別為宏,但是由於當前已將其定義為一個宏,因此唯一的實現方式是將該標識符塗成藍色。 這是不可能的(至少在預期的情況下),因為USART2必須進行擴展才能做到這一點,並且到那時您已經在注入不需要的令牌。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM