2017-02-25 3 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として解決します。それから私はPIPE1の値を取得するには#NAMEを試してみましたが、それは完全にほとんどの低レベルの表現に解決していた:

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

はUSART1_IRQHandlerを取得する方法はありますか?

答えて

1

いいえ、ありません。

連結(##)およびストリング化(#)に関与するマクロ引数は、マクロをその定義に置き換える過程でまったく展開されません。その結果、間接的なマクロを介して引数を渡すのが一般的です。そのため、それらを連結または文字列化するマクロに渡すことができます。

部分拡張の仕組みはありません。それは基本的にすべてか何かです。

マクロ置換の複雑なチェーンを構築する場合は、例のようにマクロとトークンの両方で単語を使用しないでください。

+0

あなたの答えをありがとう、それはすべてを説明します。それは試してみる価値があった... – mopsiok

関連する問題