2010-11-26 64 views
1

我有這個企圖在宏觀問題:的#define ISR(X)的#pragma ISR = X

#define ISR(x) #pragma isr=x 

不能編譯,因爲它試圖用一個不存在的參數,以取​​代#pragma。有什麼方法可以實現我想要做的事情嗎?我想獲得ISR(VEC1)擴展爲#pragma isr=VEC1

回答

5

是的。可以使用_Pragma一元運算符定義一個擴展到雜注指令的宏。

從C99標準6.10.9:

形式的一元運算符: 字串文本)被處理如下:字符串文字是通過刪除L前綴destringized ,如果存在,則刪除前導和尾部雙引號,用雙引號替換每個轉義序列\",並用單個反斜槓替換每個轉義序列\\。得到的字符序列通過翻譯階段3進行處理以產生預處理令牌,這些預處理令牌在pragma指令中被執行,就好像它們是pp令牌一樣。一元運算符表達式中的原始四個預處理標記被刪除。

從標準的一個例子是:

#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 

宏定義中的「#」是Stringification運算符。也就是說,如果#前面有一個參數,那麼它將會將其中的#操作符忽略。所以總而言之,要回答你的問題,你不能這樣做。

如果你的編譯器實現C99可以使用_Pragma而不是像_Pragma here

+0

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

更多的參考有是與ISR`的`定義一個小問題。 `_Pragma`的參數需要是單個字符串文字。 – 2010-11-26 17:15:18