在宏gcc预处理器中连接时出错

时间:2013-09-19 13:39:22

标签: gcc macros concatenation c-preprocessor

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

用这个定义:

#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

有什么想法吗?

1 个答案:

答案 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
$