我试图解码的程序包括以下行:
#define nn(sp) ((sp)->nn)
从上下文(未显示)来看,我很确定“sp”是指向包含“nn”作为其变量之一的结构的指针。
在表达式“((sp)->nn)”中,括号内的集合是否有任何可以想象的目的?如果不是,那么外面的括号集是否也无用?
我试图解码的程序包括以下行:
#define nn(sp) ((sp)->nn)
从上下文(未显示)来看,我很确定“sp”是指向包含“nn”作为其变量之一的结构的指针。
在表达式“((sp)->nn)”中,括号内的集合是否有任何可以想象的目的?如果不是,那么外面的括号集是否也无用?
#define nn(sp) ((sp)->nn)
内括号是必需的。如果您将指针p + 10
或指针传递*p
给nn
宏,那么如果没有内括号,您会遇到一些麻烦,因为->
它的优先级高于+
一元*
。
这里不需要外括号,因为表达式涉及后缀操作,并且没有运算符比后缀运算符具有更高的优先级。
将宏参数和整个替换文本包装在括号中是一种通用的防御策略。这可以保护宏免受意外的优先级更改。
考虑sp
参数是否是取消引用的指针。
nn(*x) //--> ((*x)->nn)
但没有内括号:
nn(*x) //--> (*x->nn)