gpt4 book ai didi

c - 这是什么意思? #define TIMER_PASTE_B(lft,t,rgt) lft##t##_##rgt

转载 作者:行者123 更新时间:2023-12-04 10:46:27 27 4
gpt4 key购买 nike

我在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;

但不确定该函数将如何执行。这不是一个定义,也不是一个函数。

有人知道吗?

谢谢。

最佳答案

##是拼接

#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;
}

关于c - 这是什么意思? #define TIMER_PASTE_B(lft,t,rgt) lft##t##_##rgt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47514938/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com