我对这个宏的尝试有问题:
#define ISR(x) #pragma isr=x
无法编译,因为它试图用不存在的参数替换#pragma
。有没有办法实现我想做的事情?我希望将ISR(VEC1)
扩展为#pragma isr=VEC1
。
答案 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
的更多参考资料