2016-05-17 17 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

これは不可能です。すべての連結演算子は、2つのトークンを一緒に貼り付けます。それはあなたがあなた自身でそれを書いたかのようなものです。あなたが引数を持っていた場合には、より便利です。

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

ここxUARTに置き換えられますが、それはマクロ展開し、期間ではありません。

私はあなたに本当に何をしようとしているのですか?