我的宏不可分配

时间:2018-01-10 18:43:50

标签: objective-c macros

我试图定义一个返回数字绝对值的宏。这是它的样子:

#define ABSOLUTE_VALUE(v) ( (v) < 0 ? (v) *= -1 : (v))

当我只插入一个数字时,它工作正常。问题是,当我尝试插入表达式(例如number + anotherNumber)时,编译器会抛出一个错误,说表达式不可分配。我无法弄清楚它为什么这样做。如果您知道错误的原因,我将非常感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

这里发生的事情是,整个表达式number + anotherNumber已传递到您的宏,因此在v的任何地方,它都不是结果{{1}而且,v = number + anotherNumber在评估之前被v替换。所以:

number + anotherNumber

变为

 (v) *= -1

由于(number + anotherNumber) *= -1 是另一个数字,代码的这一部分正在尝试将number + anotherNumber的值分配给-1 * (number + anotherNumber),这会导致您看到的错误,因为您可以& #39; t为表达式分配内容。

答案 1 :(得分:2)

您的一条评论:

  

问题是我正在尝试将(number + anotherNumber)*( - 1)的结果分配给表达式,即number + anotherNumber。但是,在* =运算符之前,不应该首先开火+

您误解作业。赋值的左侧(LHS)必须是左值,这意味着类似变量,它引用可以存储值的存储位置。

就是这样,它不与任何存储位置相关联,您无法分配给它。表达式number + anotherNumber的结果是一个数字,它不能用于作业的LHS。

如果您只是将=*替换为*,那么您的宏就可以使用。

HTH