2010-11-26 74 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