[英]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.