我对这个宏的尝试有问题:
#define ISR(x) #pragma isr=x
Run Code Online (Sandbox Code Playgroud)
不编译因为它试图#pragma用不存在的参数替换.有没有办法实现我想做的事情?我希望ISR(VEC1)扩大为#pragma isr=VEC1.
是.可以使用_Pragma一元运算符定义扩展为pragma伪指令的宏.
从C99标准的6.10.9开始:
形式的一元运算符:
_Pragma (字串文本)的字符串是:被如下处理destringized通过删除L前缀,如果存在的话,删除前和后双引号,替换每个转义序列\"由一个双引号,和替换每个\\通过单个反斜杠转义序列.生成的字符序列通过转换阶段3进行处理,以生成预处理标记,这些标记的执行就像它们是pragma伪指令中的pp标记一样.将删除一元运算符表达式中的原始四个预处理标记.
标准的一个例子是:
#define LISTING(x) PRAGMA(listing on #x)
#define PRAGMA(x) _Pragma(#x)
LISTING ( ..\listing.dir )
Run Code Online (Sandbox Code Playgroud)
这相当于:
#pragma listing on "..\listing.dir"
Run Code Online (Sandbox Code Playgroud)
因此,这就是您要寻找的:
#define PRAGMA(x) _Pragma(#x)
#define ISR(x) PRAGMA(isr=x)
Run Code Online (Sandbox Code Playgroud)