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

Error when concatenate in macro gcc preprocessor

提问人:togarha 提问时间:9/19/2013 最后编辑:Brian Tompsett - 汤莱恩togarha 更新时间:7/7/2016 访问量:522

问:

当我尝试在宏中使用##时,我遇到错误,这就是我尝试做的:

有了这个定义:

#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

有什么想法吗?

GCC 串联 C 预处理器

评论

0赞 Digital Trauma 9/20/2013
你是如何调用 gcc 的?,还是别的什么?哪个版本的 gcc?gcc -E <source.c>

答:

1赞 Digital Trauma 9/20/2013 #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=1PM2.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
$ 

评论

0赞 Konstantin Vladimirov 9/20/2013
真正的问题是 和 之间的空间。发生这种情况是因为宏扩展在标记之间留下了空格。有多种方法可以解决,但所有方法都失败了,因为不是有效的预处理器令牌PM2.3PM2.3
0赞 togarha 9/20/2013
那么,就没有办法实现它了吗?
0赞 Digital Trauma 9/21/2013
@KonstantinVladimirov - 是的,这是一个很好的观点。我认为问题是,一旦预处理器(假设)生成了这个,OP打算做什么。这应该是合法的 c 可以提供给 c 编译器吗?PM2.3=1
0赞 togarha 9/23/2013
是的,对于编译器完全有效(用于某些硬件中的位指令),我需要将部分用于某些寄存器:,,这就是为什么我想使用 ## 不声明所有寄存器,只有端口和引脚......PM2.3=12.3PM2.3=1PIM2.3=1POM2.3=0
2赞 togarha 9/24/2013
我终于找到了问题和解决方案,实际上指令不是 PM2.3,而是 PM2.no3,然后,由于没有“整数”,它是一个 typedef,现在工作正常,感谢您的帮助PM##PORT.no##PIN=1