提问人:togarha 提问时间:9/19/2013 最后编辑:Brian Tompsett - 汤莱恩togarha 更新时间:7/7/2016 访问量:522
在宏 gcc 预处理器中连接时出错
Error when concatenate in macro gcc 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赞
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=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
$
评论
0赞
Konstantin Vladimirov
9/20/2013
真正的问题是 和 之间的空间。发生这种情况是因为宏扩展在标记之间留下了空格。有多种方法可以解决,但所有方法都失败了,因为不是有效的预处理器令牌PM2.
3
PM2.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=1
2.3
PM2.3=1
PIM2.3=1
POM2.3=0
2赞
togarha
9/24/2013
我终于找到了问题和解决方案,实际上指令不是 PM2.3,而是 PM2.no3,然后,由于没有“整数”,它是一个 typedef,现在工作正常,感谢您的帮助PM##PORT.no##PIN=1
下一个:从命令行解析数字 argv
评论
gcc -E <source.c>