1

当我尝试在宏中使用 ## 时出现错误,这是我尝试做的:

有了这个定义:

#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

任何的想法?

4

1 回答 1

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
$ 
于 2013-09-19T21:45:11.020 回答