我有这个企图在宏观问题:的#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