2016-05-17 150 views
4

我正在嘗試開發PIC微控制器的通用UART模塊。我想要做的是定義正在使用的UART,然後讓預處理器自動將其替換爲其他宏(寄存器名稱)。C預處理器宏替換

喜歡的東西:

#define UART  5 
#define UART_RXREG U ## UART ## RXREG 

這是不行的,因爲它擴展到UUARTRXREG而不是U5RXREG

有沒有辦法做到這一點,或者它根本不可能?

請注意,我不是在尋找一個簡單的字符串連接。我需要首先擴展UART宏。

+0

如果您使用支持它的預處理器,它工作正常。 –

+1

爲什麼不使用帶參數的宏? –

+0

@ IgnacioVazquez-Abrams:什麼樣的預處理器支持它?用'gcc -E','UART_RXREG'擴展爲'UUARTRXREG'。我相信那是必需的行爲。 –

回答

9

你需要宏觀間接的水平,使級聯令牌可擴展:

#define CONCAT3_(a,b,c) a##b##c 
#define CONCAT3(a,b,c) CONCAT3_(a,b,c) 

#define UART 5 
#define UART_RXREG CONCAT3(U,UART,RXREG) 
+0

適用於MSVC。 –

+0

這個工程!謝謝。 – andreia

1

不,這是不可能的。所有連接操作符都將兩個令牌粘貼在一起。就好像你自己寫的一樣,哪一種能夠擊敗整個觀點。更爲有用,如果你有一個說法:

#define UART  5 
#define _UART_RXREG(x) U ## x ## RXREG 
#define UART_REXREG _UART_RXREG(UART) 

這裏xUART取代,但它不會是宏擴大,期。

我想我應該問,你真的想做什麼?