C:围绕一个变量的并列关系,没有其他操作数
我正在研究FreeRTOS的源代码。我发现了这个片段:C:围绕一个变量的并列关系,没有其他操作数,c,freertos,C,Freertos,我正在研究FreeRTOS的源代码。我发现了这个片段: #定义下一个条目(pxTCB,pxList)的列表获取所有者\ { \ List_t*const pxConstList=(pxList)\ /*将索引增加到下一项并返回该项,确保*/\ /*我们不返回列表末尾使用的标记。*/\ (pxConstList)->p
#定义下一个条目(pxTCB,pxList)的列表获取所有者\
{ \
List_t*const pxConstList=(pxList)\
/*将索引增加到下一项并返回该项,确保*/\
/*我们不返回列表末尾使用的标记。*/\
(pxConstList)->pxIndex=(pxConstList)->pxIndex->pxNext\
如果((void*)(pxConstList)->pxIndex==(void*)和((pxConstList)->xListEnd))\
{ \
(pxConstList)->pxIndex=(pxConstList)->pxIndex->pxNext\
} \
(pxTCB)=(pxConstList)->pxIndex->pvOwner\
}
我知道(pxConstList)->pxIndex
意味着访问指针变量pxConstList的数据。但是我想知道仅用括号括起变量的含义是什么
即:
List\u t*const pxConstList=(pxList);
~~~~~~~~~~
及
(pxTCB)=(pxConstList)->pxIndex->pvOwner;
~~~~~~~~~~
谢谢。这些变量实际上是宏的参数。括号是必需的,因为参数可能是一个表达式,如果没有括号,它将无法正确地适应上下文
例如,考虑以下宏:
#define SQUARE(x) x*x
如果您这样调用此宏:
SQUARE(4+5)
#define SQUARE(x) (x)*(x)
你会得到:
4+5*4+5
由于*
的优先级高于+
,因此这将计算为29,而不是预期的81。如果宏的定义如下:
SQUARE(4+5)
#define SQUARE(x) (x)*(x)
然后,上述内容将扩展到:
(4+5)*(4+5)
这将评估为81
因此,总而言之,建议始终将宏参数插入括号中,以避免这些类型的问题。请注意,listGET\u OWNER\u of_NEXT\u ENTRY
是一个宏(不是函数),即pxTCB
和pxList
将被复制粘贴。如果它们是表达式,则必须在其周围加括号。为什么?看这里我认为这是相似的。谢谢,啊。谢谢你的解释!我不知道这部分被定义为宏。明白了。谢谢