我是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;
编译器认为这很好。
我猜这里有一些隐含的演员或其他一些语言功能 - 有人可以向我解释发生了什么吗?
答案 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_OFFSET
与6;
的任何出现,因此,就像其他人所说的那样,删除分号;
你已经准备好了。
此外,在为简单的数学函数定义宏时,请记住将它们放在括号(
和)
中,否则,最终可能会出现一些数学运算顺序错误(如添加前的非预期部分乘法)