【问题标题】:Unable to concatenate tokens in CPP无法在 CPP 中连接令牌
【发布时间】:2020-04-27 19:50:10
【问题描述】:

(是的,这又是可怕的 C 预处理器连接标记...)

我正在尝试制作一个 CPP 宏,它采用公式的多个部分并将它们输入以制作成品。我以各种方式尝试过##,但总是遇到可怕的“粘贴 X 和 Y 不会给出有效的预处理器令牌”问题。

我有标记 23TRISSET,需要将宏扩展为:

(sfr_t)(&TRISASET + ((23 / 16) * 0x100))

也就是说,类似于:

#define gpioPIN_TO_REGSUB(P, R, S)  (sfr_t)(& ## R ## A ## S ## + (((P)/16) * 0x100))
                                            &    TRIS A    SET      (23)  

但这当然行不通。

我尝试将每个部分都输入到另一个宏中进行连接,但效果相同。

【问题讨论】:

  • 你到底想做什么?你想让gpioPIN_TO_REGSUB(23, TRIS, SET) 产生(sfr_t)(&TRISASET + ((23 / 16) * 0x100))gpioPIN_TO_REGSUB应该如何使用?你怎么称呼gpioPIN_TO_REGSUB?将S ## + 替换为S +
  • @KamilCuk gpioPIN_TO_REGSUB 将像变量一样使用。

标签: c c-preprocessor


【解决方案1】:

&TRISSET+ 不是有效的预处理器令牌。您只能使用## 令牌加入,这将产生有效的预处理器令牌。只是不要 - 无论如何它们都是单独的令牌。

#define gpioPIN_TO_REGSUB(P, R, S)  (sfr_t)(&R ## A ## S + (((P)/16) * 0x100))

【讨论】:

  • 啊,谢谢。是的,这看起来更好。当我不需要连接时,我感到困惑和连接。
  • @majenko:是的。问题不在于令牌连接是可怕的。就是被人宠坏了。最好害怕它。仅在绝对必要时使用。
  • @rici 是的。在这种情况下,它要么使用令牌连接,要么编写一个脚本来为我生成数百行几乎相同的代码。
  • & 是一个有效的预处理器令牌本身,但&TRIS 不是。与+SET+ 类似。但是您可以使用##&= 粘贴在一起以生成&=
猜你喜欢
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 2016-11-21
  • 2017-11-22
  • 1970-01-01
  • 2021-03-18
  • 2021-11-06
  • 1970-01-01
相关资源
最近更新 更多