2017-02-25 47 views
2

我有一個指向另一個宏宏:C預處理 - 連接字符串沒有多個解決

#define USART1    ((USART_TypeDef *) USART1_BASE) 
#define PIPE1    USART1 

我想補充,我將作爲一個函數定義中使用靜態文本(USART1變得USART1_IRQHandler) 。我試過類似於:

#define _IRQ(NAME)  NAME ## _IRQHandler 
void _IRQ(PIPE1)(void) { 
    //... 
} 

但名稱解析爲PIPE1_IRQHandler而不是USART1_IRQHandler。然後我試圖#NAME得到PIPE1的價值,但它已經完全解決最低級表示:

((USART_TypeDef *) ((((uint32_t)0x40000000) + 0x10000) + 0x3800)) 

有沒有什麼辦法讓USART1_IRQHandler?

回答

1

不,沒有。

參數連接(##)和字符串化(#)的宏參數在用其定義替換宏時根本沒有展開。因此,通過一個間接宏來傳遞參數是很常見的,所以它們將被完全放大,並傳遞給連接或串聯它們的宏。

沒有部分擴展的機制。這基本上是全部或沒有。

如果您想構建複雜的宏替換鏈,則需要避免將詞作爲宏和標記段使用,如示例中所示。

+0

謝謝你的回答,那解釋了一切。值得一試... – mopsiok