【问题标题】:What does this mean? #define TIMER_PASTE_B(lft,t,rgt) lft##t##_##rgt这是什么意思? #define TIMER_PASTE_B(lft,t,rgt) lft##t##_##rgt
【发布时间】:2017-11-27 15:54:19
【问题描述】:

我在ATTiny85音核库中找到了如下函数定义。我无法弄清楚这是什么意思,或者它是如何工作的。它经常用于创建函数名称,但不确定语法如何工作。

这是我对该函数所做的追溯。定义上有很多定义:

一审:

 void tone( uint8_t _pin, unsigned int frequency, unsigned long duration )
{
  tonetimer_(ocr_t)             ocr;
  tonetimer_(prescale_value_t)  csv;
  tonetimer_(cs_t)              csi; //and the function continue...

然后我跟踪函数tonetimer_被定义为:

#define tonetimer_(t)  TIMER_PASTE_A( timer, TIMER_TO_USE_FOR_TONE, t )
#define ToneTimer_(f)  TIMER_PASTE_A( Timer, TIMER_TO_USE_FOR_TONE, f )
#define TONETIMER_(c)  TIMER_PASTE_A( TIMER, TIMER_TO_USE_FOR_TONE, c )

然后我发现TIMER_PASTE_A函数定义为:

#define TIMER_PASTE_A(lft,t,rgt)      TIMER_PASTE_B(lft,t,rgt)

最后我找到了 TIMER_PASTE_B 的定义:

#define TIMER_PASTE_B(lft,t,rgt)         lft##t##_##rgt

这就是我卡住的地方。我无法遵循这种语法。我很好地进行了简单的替换。但是,## 让我失望了。

所以在进行替换后,我可以看到最终的命令是这样的:

timer##TIMER_TO_USE_FOR_TONE##_##ocr_t      ocr;

但不确定该函数将如何执行。这既不是定义也不是功能。

有人知道吗?

谢谢。

【问题讨论】:

    标签: c avr-gcc attiny


    【解决方案1】:

    ## 是串联

    #define TIMER_PASTE_B(lft,t,rgt)  lft##t##_##rgt
    

    预处理器将定义扩展为lftt_rgt 的串联。

    例如

    TIMER_PASTE_B(ABC,DEF,GHI) 
    

    将标记 ABC、DEF、GHI 和 _ 连接到

    ABCDEF_GHI
    

    编辑

    假设您将 TIMER_TO_USE_FOR_TONE 定义为计时器 3,例如

    #define TIMER_TO_USE_FOR_TONE 3
    

    结果是

    void tone( uint8_t _pin, unsigned int frequency, unsigned long duration )
    {
      timer3_ocr_t ocr;
      timer3_prescale_value_t csv;
      timer3_cs_t csi;
    }
    

    【讨论】:

    • 那么最终的表达式会是什么样子?会是这样吗? timerTIMER_TO_USE_FOR_TONE_ocr_t ocr;
    • 我找到了。 TIMER_TO_USE_FOR _TONE 也是一个定义,所以我将不得不追溯它。这是一场噩梦。不过谢谢,这很有帮助!
    【解决方案2】:

    ## 运算符采用两个单独的标记并将它们粘贴在一起形成一个标记。生成的标记可以是变量名、类名或任何其他标识符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-16
      • 2021-10-29
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      相关资源
      最近更新 更多