目标c:在数学表达式中使用#define常量值

时间:2012-01-23 11:06:21

标签: iphone objective-c

我是iPhone开发的新手,我只是尝试了一些简单的绘图程序,而且我在使用简单数学中的定义值时遇到了麻烦。

我有这样一句话:

int offset = (((myValue - min_value) * 6) - middle);

这很好 - 但我不喜欢在那里使用硬编码的6(因为我会在很多地方使用它。

所以我认为我使用#define定义一个常量:

#define WIDTH_OFFSET 6;

然后我可以使用:

int offset = (((myValue - min_value) * WIDTH_OFFSET) - middle);

然而 - 这会产生编译错误:"预期表达。"

我可以通过将计算分解为几行来解决这个问题:

int offset = myValue - min_value;
offset = offset * WIDTH_OFFSET;
offset = offset - middle;

编译器认为这很好。

我猜这里有一些隐含的演员或其他一些语言功能 - 有人可以向我解释发生了什么吗?

4 个答案:

答案 0 :(得分:14)

;之后删除分号#define

#define WIDTH_OFFSET 6

#define从字面上替换它的参数,因此预处理后的表达式变为

(((myValue - min_value) * 6;) - middle);

如您所见,表达式中间有一个分号,这是一个语法错误。

另一方面,你的另一个表达

int offset = myValue - min_value;
offset = offset * WIDTH_OFFSET;

没有出现这样的问题,因为在

中连续有两个分号
 offset = offset * 6;;

在语法上是有效的。

答案 1 :(得分:4)

当你#define你使用的东西时,完全就像你在那里输入它一样。所以在你使用WIDTH_OFFSET的地方你得到6;在它的位置 - 这当然不是你的意图。所以只需删除分号。

答案 2 :(得分:2)

正如dasblinkenlight所说,取出半结肠。对此的解释是#defines是代码中的字面替换。因此,对于半冒号,您的破坏代码为:

int offset = (((myValue - min_value) * 6;) - middle);

工作代码阅读:

offset = offset * 6;;

在语法上很好;实际上是代码的空白“行”。

答案 3 :(得分:2)

基本上,宏是预处理器内联的便捷函数。因此,您可以认为他们正在为匹配的条目进行复制/粘贴,在您的情况下,它会替换WIDTH_OFFSET6;的任何出现,因此,就像其他人所说的那样,删除分号;你已经准备好了。

此外,在为简单的数学函数定义宏时,请记住将它们放在括号()中,否则,最终可能会出现一些数学运算顺序错误(如添加前的非预期部分乘法)