0

我试图解码的程序包括以下行:

#define nn(sp)   ((sp)->nn)

从上下文(未显示)来看,我很确定“sp”是指向包含“nn”作为其变量之一的结构的指针。

在表达式“((sp)->nn)”中,括号内的集合是否有任何可以想象的目的?如果不是,那么外面的括号集是否也无用?

4

2 回答 2

5
#define nn(sp)   ((sp)->nn)

内括号是必需的。如果您将指针p + 10或指针传递*pnn宏,那么如果没有内括号,您会遇到一些麻烦,因为->它的优先级高于+一元*

这里不需要外括号,因为表达式涉及后缀操作,并且没有运算符比后缀运算符具有更高的优先级。

于 2013-06-30T00:18:48.760 回答
4

将宏参数和整个替换文本包装在括号中是一种通用的防御策略。这可以保护宏免受意外的优先级更改。

考虑sp参数是否是取消引用的指针。

nn(*x)  //--> ((*x)->nn)

但没有内括号:

nn(*x)  //--> (*x->nn)
于 2013-06-30T00:18:58.253 回答