#define ISR(x)#pragma isr = x

1 c c-preprocessor

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

#define ISR(x) #pragma isr=x
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*ien 5

是.可以使用_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)