首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >#定义ISR(x) #杂注isr=x

#定义ISR(x) #杂注isr=x
EN

Stack Overflow用户
提问于 2010-11-26 23:53:22
回答 2查看 601关注 0票数 1

我在尝试使用宏时遇到了问题:

代码语言:javascript
复制
#define ISR(x) #pragma isr=x

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

EN

回答 2

Stack Overflow用户

发布于 2010-11-27 00:30:27

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

从C99标准的6.10.9开始:

形式的一元运算符:_Pragma (字符串-文字)的处理方式如下:字符串文字的反字符串形式为:删除L前缀,删除前导和尾部双引号,将每个转义序列\"替换为双引号,并将每个转义序列\\替换为单反斜杠。所得到的字符序列通过转换阶段3被处理,以产生预处理标记,所述预处理标记被执行,就好像它们是杂注指令中的pp标记一样。一元运算符表达式中的原始四个预处理标记被删除。

该标准中的一个示例是:

代码语言:javascript
复制
#define LISTING(x) PRAGMA(listing on #x)
#define PRAGMA(x) _Pragma(#x)
LISTING ( ..\listing.dir )

相当于:

代码语言:javascript
复制
#pragma listing on "..\listing.dir"

因此,这就是您要查找的内容:

代码语言:javascript
复制
#define PRAGMA(x) _Pragma(#x)
#define ISR(x) PRAGMA(isr=x)
票数 5
EN

Stack Overflow用户

发布于 2010-11-27 00:50:22

这将不会像在代码中那样工作

代码语言:javascript
复制
#define ISR(x) #pragma isr=x 

宏定义中的"#“是Stringification运算符。也就是说,如果#在参数之前,它会将其串化,否则#操作符将被忽略。所以总而言之,回答你的问题你不能这样做。

如果您的编译器实现了C99,则可以使用_Pragma,如下所示

代码语言:javascript
复制
#define ISR(X) _Pragma(isr=x)

有关_Pragma here的更多参考

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4286715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档