我正在尝试解码的程序包括以下行:
#define nn(sp) ((sp)->nn)
从上下文(未显示)中,我很确定'sp'是一个指向结构的指针,该结构包含'nn'作为其变量之一。
在表达式“((sp) - > nn)”中,内部括号是否可用于任何可能的目的?如果没有,那么外部括号也可能没有用处吗?
答案 0 :(得分:5)
#define nn(sp) ((sp)->nn)
内括号是必需的。如果您将p + 10
或*p
指针传递给nn
宏,那么在没有内括号的情况下会遇到一些麻烦,因为->
的优先级高于+
且一元*
。
此处不需要外括号,因为表达式涉及后缀操作,并且没有运算符优先于后缀运算符。
答案 1 :(得分:4)
这是一种通用的防御策略,可以将宏观参数和整个替换文本包装在parens中。这可以保护宏免受意外的优先级更改。
考虑sp
参数是否是一个解除引用的指针。
nn(*x) //--> ((*x)->nn)
但没有内在的内容:
nn(*x) //--> (*x->nn)