C:围绕一个变量的并列关系,没有其他操作数

C:围绕一个变量的并列关系,没有其他操作数,c,freertos,C,Freertos,我正在研究FreeRTOS的源代码。我发现了这个片段: #定义下一个条目(pxTCB,pxList)的列表获取所有者\ { \ List_t*const pxConstList=(pxList)\ /*将索引增加到下一项并返回该项,确保*/\ /*我们不返回列表末尾使用的标记。*/\ (pxConstList)->p

我正在研究FreeRTOS的源代码。我发现了这个片段:

#定义下一个条目(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
将被复制粘贴。如果它们是表达式,则必须在其周围加括号。为什么?看这里

我认为这是相似的。谢谢,啊。谢谢你的解释!我不知道这部分被定义为宏。明白了。谢谢