#define ISR(x)#pragma isr = x

时间:2010-11-26 15:53:22

标签: c c-preprocessor

我对这个宏的尝试有问题​​:

#define ISR(x) #pragma isr=x

无法编译,因为它试图用不存在的参数替换#pragma。有没有办法实现我想做的事情?我希望将ISR(VEC1)扩展为#pragma isr=VEC1

2 个答案:

答案 0 :(得分:5)

是。可以使用_Pragma一元运算符定义一个扩展为pragma伪指令的宏。

从C99标准的6.10.9开始:

  

表单的一元运算符:_Pragma ( string-literal )按如下方式处理:字符串文字 destringized 删除L前缀(如果存在),删除前导和尾部双引号,用双引号替换每个转义序列\",并用单个反斜杠替换每个转义序列\\。生成的字符序列通过转换阶段3进行处理,以生成预处理令牌,这些令牌在pragma指令中就像它们是 pp-tokens 一样执行。将删除一元运算符表达式中的原始四个预处理标记。

标准的一个例子是:

#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)

答案 1 :(得分:3)

这在代码中不起作用

#define ISR(x) #pragma isr=x 

宏定义中的“#”是Stringification运算符。也就是说,如果#在一个参数之前,它将字符串化,否则#ever运算符将被忽略。所以总结回答你的问题你不能这样做。

如果你的编译器实现了C99,你可以使用_Pragma来代替这个

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

有关_Pragma here

的更多参考资料
相关问题