2010-11-26 9 views
1

私はマクロでこの試みに問題があります。存在しないパラメータで#pragmaを交換しようとしているので、の#define ISR(X)の#pragma ISR = X

#define ISR(x) #pragma isr=x 

がコンパイルされません。私がやろうとしていることを達成する方法はありますか? ISR(VEC1)#pragma isr=VEC1に展開したいと思います。

答えて

5

はい。 _Pragma単項演算子を使用してプラグマ指令に展開されるマクロを定義することは可能です。 C99標準の6.10.9から

形態の単項演算子:次のように 文字列リテラル)が処理される:文字列リテラルはLプレフィックスを削除することによってをdestringizedれます先頭と末尾の二重引用符を削除し、各エスケープシーケンス\"を二重引用符で置き換え、各エスケープシーケンス\\を単一の円記号で置き換えます。結果の文字列は変換フェーズ3で処理されて、プラグマディレクティブにpp-tokensのように実行される前処理トークンを生成します。単項演算子式の元の4つの前処理トークンは削除されます。

標準の例は次のとおりです。

と同等です
#define LISTING(x) PRAGMA(listing on #x) 
#define PRAGMA(x) _Pragma(#x) 
LISTING (..\listing.dir) 

#pragma listing on "..\listing.dir" 

したがって、これはあなたが探しているものです。

#define PRAGMA(x) _Pragma(#x) 
#define ISR(x) PRAGMA(isr=x) 
3

このコードのように動作しません

#define ISR(x) #pragma isr=x 

マクロ定義の「#」は、ストリング化演算子です。つまり、引数の前に#があると、それを文字列化します。else#演算子は無視されます。だからあなたの質問に答える要約では、これを行うことはできません。

あなたのコンパイラはC99を実装している場合、あなたはISR` `のあなたの定義に若干の問題があり_Pragma here

+0

でこの

#define ISR(X) _Pragma(isr=x) 

複数の基準のような代わりに_Pragmaを使用することができます。 '_Pragma'の引数は単一の文字列リテラルでなければなりません。 –

+0

私の悪いはい、あなたはそれが_Pragmaに渡す前にstringifyする必要があることが正しいです –

関連する問題