Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 这是什么意思#定义计时器粘贴(lft,t,rgt)lft########rgt_C_Avr Gcc_Attiny - Fatal编程技术网

C 这是什么意思#定义计时器粘贴(lft,t,rgt)lft########rgt

C 这是什么意思#定义计时器粘贴(lft,t,rgt)lft########rgt,c,avr-gcc,attiny,C,Avr Gcc,Attiny,我在ATTiny85音调核心库中找到了以下函数定义。我无法理解这意味着什么,或者它是如何工作的。它经常用于创建函数名,但不确定语法是如何工作的 下面是我对函数所做的跟踪。定义之上有许多定义: 一审: void tone( uint8_t _pin, unsigned int frequency, unsigned long duration ) { tonetimer_(ocr_t) ocr; tonetimer_(prescale_value_t) csv;

我在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_uu,将其定义为:

#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 )
#define TIMER_PASTE_A(lft,t,rgt)      TIMER_PASTE_B(lft,t,rgt)
然后我发现TIMER_PASTE_函数定义为:

#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 )
#define TIMER_PASTE_A(lft,t,rgt)      TIMER_PASTE_B(lft,t,rgt)
最后,我找到了计时器粘贴的定义:

#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
预处理器将定义扩展为
lft
t
rgt
的串联

比如说

TIMER_PASTE_B(ABC,DEF,GHI) 
#define TIMER_TO_USE_FOR_TONE 3
将连接标记ABC、DEF、GHI和uTo

ABCDEF_GHI
编辑

例如,假设您定义TIMER_TO_USE_FOR_TONE为TIMER 3

TIMER_PASTE_B(ABC,DEF,GHI) 
#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\u将\u用于\u音调\u ocr\u t ocr;我找到了。TIMER-TO-USE-FOR-TONE也是一个定义,所以我必须追溯它。这是一场噩梦。但是谢谢,这很有帮助!