我有這個企圖在宏觀問題:的#define ISR(X)的#pragma ISR = X
#define ISR(x) #pragma isr=x
不能編譯,因爲它試圖用一個不存在的參數,以取代#pragma
。有什麼方法可以實現我想要做的事情嗎?我想獲得ISR(VEC1)
擴展爲#pragma isr=VEC1
。
我有這個企圖在宏觀問題:的#define ISR(X)的#pragma ISR = X
#define ISR(x) #pragma isr=x
不能編譯,因爲它試圖用一個不存在的參數,以取代#pragma
。有什麼方法可以實現我想要做的事情嗎?我想獲得ISR(VEC1)
擴展爲#pragma isr=VEC1
。
是的。可以使用_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)
這將不會如代碼
#define ISR(x) #pragma isr=x
宏定義中的「#」是Stringification運算符。也就是說,如果#前面有一個參數,那麼它將會將其中的#操作符忽略。所以總而言之,要回答你的問題,你不能這樣做。
如果你的編譯器實現C99可以使用_Pragma而不是像_Pragma here
這
更多的參考有是與ISR`的`定義一個小問題。 `_Pragma`的參數需要是單個字符串文字。 – 2010-11-26 17:15:18