当我尝试在宏中使用##时出现错误,这是我尝试制作的内容:
用这个定义:
#define PORT 2
#define PIN 3
我希望预处理器生成:
PM2.3=1
当我像这样调用一个宏时:
SetPort(PORT,PIN)
然后,我看到我可以在连接的同时进行替换PORT和PIN,然后我认为我必须使用2定义:
#define SetP2(PORT,PIN) PM##PORT.PIN = 1
#define SetPort(PORT,PIN) SetP2(PORT,PIN)
但是我收到了错误:
#define PIN 3 --> expected identifier before numeric constant
并发出警告:
SetPort(PORT,PIN) --> Syntax error
有什么想法吗?
答案 0 :(得分:1)
这对我有用:
$ cat portpin.c
#define PORT 2
#define PIN 3
#define SetP2(prefix,prt) prefix ## prt
#define SetPort(prt,pn) SetP2(PM,prt).pn = 1
SetPort(PORT,PIN)
$ gcc -E portpin.c
# 1 "portpin.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "portpin.c"
PM2. 3 = 1
$
我不知道.
和3
之间没有空格是多么重要,但预处理器似乎想要插入它。
更新:
实际上我尝试过你的原始代码,它似乎产生了相同的结果,所以我上面的答案对你来说可能没什么用。
更新2:
事实证明OP期望预处理器生成PM2.no3=1
而不是PM2.3=1
。这可以很容易地完成如下:
$ cat portpin.c
#define PORT 2
#define PIN 3
#define SetP2(PORT,PIN) PM##PORT.no##PIN=1
#define SetPort(PORT,PIN) SetP2(PORT,PIN)
SetPort(PORT,PIN)
$ gcc -E portpin.c
# 1 "portpin.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "portpin.c"
PM2.no3=1
$