我正在嘗試開發PIC微控制器的通用UART模塊。我想要做的是定義正在使用的UART,然後讓預處理器自動將其替換爲其他宏(寄存器名稱)。C預處理器宏替換
喜歡的東西:
#define UART 5
#define UART_RXREG U ## UART ## RXREG
這是不行的,因爲它擴展到UUARTRXREG
而不是U5RXREG
。
有沒有辦法做到這一點,或者它根本不可能?
請注意,我不是在尋找一個簡單的字符串連接。我需要首先擴展UART宏。
我正在嘗試開發PIC微控制器的通用UART模塊。我想要做的是定義正在使用的UART,然後讓預處理器自動將其替換爲其他宏(寄存器名稱)。C預處理器宏替換
喜歡的東西:
#define UART 5
#define UART_RXREG U ## UART ## RXREG
這是不行的,因爲它擴展到UUARTRXREG
而不是U5RXREG
。
有沒有辦法做到這一點,或者它根本不可能?
請注意,我不是在尋找一個簡單的字符串連接。我需要首先擴展UART宏。
你需要宏觀間接的水平,使級聯令牌可擴展:
#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)
適用於MSVC。 –
這個工程!謝謝。 – andreia
不,這是不可能的。所有連接操作符都將兩個令牌粘貼在一起。就好像你自己寫的一樣,哪一種能夠擊敗整個觀點。更爲有用,如果你有一個說法:
#define UART 5
#define _UART_RXREG(x) U ## x ## RXREG
#define UART_REXREG _UART_RXREG(UART)
這裏x
被UART
取代,但它不會是宏擴大,期。
我想我應該問,你真的想做什麼?
如果您使用支持它的預處理器,它工作正常。 –
爲什麼不使用帶參數的宏? –
@ IgnacioVazquez-Abrams:什麼樣的預處理器支持它?用'gcc -E','UART_RXREG'擴展爲'UUARTRXREG'。我相信那是必需的行爲。 –