【问题标题】:Error when concatenate in macro gcc preprocessor在宏 gcc 预处理器中连接时出错
【发布时间】:2013-09-19 13:39:22
【问题描述】:

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

这样定义:

#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 的? gcc -E <source.c>,还是别的什么?哪个版本的 gcc?

标签: gcc macros concatenation c-preprocessor


【解决方案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
$ 

【讨论】:

  • 真正的问题是PM2.3 之间的空格。发生这种情况是因为宏扩展在标记之间留下了空格。有多种解决方法,但都失败了,因为 PM2.3 不是有效的预处理器令牌
  • 那么,有没有办法实现呢?
  • @KonstantinVladimirov - 是的,这是一个好点。我认为问题是,一旦预处理器(假设地)生成了这个,OP 打算用PM2.3=1 做什么。这应该是合法的 c 可以提供给 c 编译器吗?
  • 是的,PM2.3=1 对编译器完全有效(用于某些硬件中的位指令),我需要将部分 2.3 用于某些寄存器:PM2.3=1,PIM2.3=1 ,POM2.3=0这就是为什么我想用##不声明所有寄存器,只声明端口和引脚...
  • 我终于找到了问题和解决方案,真的指令不是 PM2.3 而是 PM2.no3,然后,由于没有“整数”,它是 typedef,现在 PM##PORT.no##PIN=1 工作正常,谢谢你的帮助
猜你喜欢
  • 2011-09-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 2012-04-25
  • 2021-03-19
  • 1970-01-01
相关资源
最近更新 更多