我在尝试使用宏时遇到了问题:
#define ISR(x) #pragma isr=x无法编译,因为它试图用不存在的参数替换#pragma。有没有办法实现我想要做的事情?我想将ISR(VEC1)扩展为#pragma isr=VEC1。
发布于 2010-11-27 00:30:27
是。可以使用_Pragma一元运算符定义一个扩展为杂注指令的宏。
从C99标准的6.10.9开始:
形式的一元运算符:
_Pragma (字符串-文字)的处理方式如下:字符串文字的反字符串形式为:删除L前缀,删除前导和尾部双引号,将每个转义序列\"替换为双引号,并将每个转义序列\\替换为单反斜杠。所得到的字符序列通过转换阶段3被处理,以产生预处理标记,所述预处理标记被执行,就好像它们是杂注指令中的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)发布于 2010-11-27 00:50:22
这将不会像在代码中那样工作
#define ISR(x) #pragma isr=x 宏定义中的"#“是Stringification运算符。也就是说,如果#在参数之前,它会将其串化,否则#操作符将被忽略。所以总而言之,回答你的问题你不能这样做。
如果您的编译器实现了C99,则可以使用_Pragma,如下所示
#define ISR(X) _Pragma(isr=x)有关_Pragma here的更多参考
https://stackoverflow.com/questions/4286715
复制相似问题