Objective-C: 在数学表达式中使用 #define 常量值

5

我是iPhone开发的新手,现在正在尝试一些简单的绘图例程,但在使用简单的数学计算时遇到了麻烦。

我有这样一行代码:

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

这个可以正常工作 - 但我不喜欢在其中使用硬编码的6(因为我会在很多地方使用它)。

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

#define WIDTH_OFFSET 6;

那么我可以使用:

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

然而 - 这将会导致编译错误: "Expected Expression."

我可以通过将计算拆分成几行来解决此问题:

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

编译器认为这是可以的。 我猜测这里有一些隐式转换或其他语言特性在起作用 - 有人能解释一下正在发生什么吗?
4个回答

14

#define后面移除分号;

#define WIDTH_OFFSET 6

#define会将其参数进行字面替换,因此在预处理后,您的表达式变成了

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

正如您所看到的,该表达式中间有一个分号,这是一种语法错误。

另一方面,您的另一个表达式

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

不会出现这样的问题,因为有两个分号并列的情况

 offset = offset * 6;;

语法上是有效的。


是的 - 你可以在任何地方用它来做几乎任何事情。将#define想象成一个宏,可以键入你心中想要的任何内容。它非常强大,而且你可以有条件地使用它,就像增加了它的威力。 - Jeshua Lacock
@GirlCalledPete 嗯,不是完全可以用任何情况下,但你可以肯定地玩弄很多 预处理器宏定义,特别是一旦你开始向它们传递参数。但要小心不要过度使用预处理器,因为它会使你的代码变得非常难读。 - Sergey Kalinichenko
实际上,如果使用得当,您可以提高代码的可读性,例如,您可以将83(或其他数字)个字符作为一个单词。 - Jeshua Lacock
@dasblinkenlight - 确实,如果你有太多的宏代码散落在各个地方,很容易陷入意大利面条式的噩梦中 - 但在你只需要绕过某些东西的时候非常有用 ;) - Pete McPhearson
@Michał Zygar 是的 - 这可能比发送消息给一个获取 getMax 类型方法更简洁 - 如果变得更加复杂,我猜你开始需要一个方法来解开它 :) - Pete McPhearson
显示剩余3条评论

4
在定义something的时候,在使用它的地方和你自己输入它完全相同。所以在使用WIDTH_OFFSET时,你得到的是6;而不是你想要的结果。因此,只需去掉分号即可。

2
基本上,宏是由预处理器内联放置的便捷函数。因此,您可以认为它们正在为匹配条目复制/粘贴,在您的情况下,它将用 6; 替换任何出现的 WIDTH_OFFSET,所以,就像其他人说的那样,去掉分号 ; 就可以了。
另外,当定义简单数学函数的宏时,请记得将它们放在括号 () 中,否则,您可能会遇到一些数学操作顺序错误(如意外的部分乘法先于加法)。

2
如dasblinkenlight所说,删除分号。这样做的解释是#defines是代码中的文字替换。因此,如果带有分号,则您的代码会出现错误:
int offset = (((myValue - min_value) * 6;) - middle);

工作代码读取如下:
offset = offset * 6;;

这是语法上没有问题的,因为“;;”实际上是一行空白的代码。


而在此期间,dasblinkenlight编辑了该帖子。 :D - Diziet
谢谢你的澄清 - 即使dasblinkenlight很快就插进来了 ;) - Pete McPhearson
显然,我需要学会更快地打字。 :D 为您的投票而激烈竞争! - Jeshua Lacock
我也是这样,尽管我浪费了一些时间来检查.2和02之间是否有操作上的差异。 - Diziet
快速打字似乎是当今的趋势 - 有时候我感觉我还没打完问题,答案就已经出现了!我给你的答案点了个赞 - 但我只能接受一个!;) - Pete McPhearson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接