2012-01-23 24 views
4

我是iPhone新手,我只是嘗試一些簡單的繪圖程序,並且在簡單的數學中使用定義的值時遇到了問題。目標c:在數學表達式中使用#define常量值

我有這樣一行:

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

,這工作得很好 - 但我不喜歡使用那裏的硬編碼6(因爲我會用它很多地方

所以我想我會定義一個常數使用#:

#define WIDTH_OFFSET 6; 

然後我可以使用:

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

但是 - 這得到一個編譯器錯誤:「預期的表現。」

我可以避開這個由分手計算到幾行:

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

編譯器認爲這是好的。

我猜這裏有一些隱含的演員或其他語言功能在這裏工作 - 任何人都可以向我解釋發生了什麼?

回答

14

刪除分號;#define

#define WIDTH_OFFSET 6 

#define替代它的參數從字面上看,因此預處理後您的表達變得

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

正如你所看到的,是在中間的分號表達式,這是一個語法錯誤。

在另一方面,你的其他表達

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

沒有表現出這樣的問題,因爲有連續兩個分號作爲

offset = offset * 6;; 

在語法上是有效的。

+0

Ninja'd我與該編輯。 :D – Diziet

+0

:)謝謝!這很有道理 - 這些菜鳥錯誤之一;) 作爲一個額外的想法 - 這是否意味着你可以使用'#define'與任何代碼行(如某種代碼段)?這可能很有趣:) –

+0

是的 - 你可以在任何地方使用它,幾乎任何東西。把#define想象成一個宏來輸入任何你想要的東西。這是非常強大的,你可以有條件地使用它,就像增加它的力量。 –

2

正如dasblinkenlight所說,刪除分號。對此的解釋是#defines是代碼中的文字替換。因此,用分號你的斷碼閱讀:

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

工作代碼閱讀:

offset = offset * 6;; 

把作爲;;語法精實際上是空白的「代碼行」。

+0

而且,在過渡期間dasblinkenlight編輯帖子。 :D – Diziet

+0

:)感謝您的澄清 - 儘管dasblinkenlight偷偷在那裏快速;) –

+0

顯然我需要學習如何打字更快。 :D激烈競爭您的投票! –

4

當你定義一個你使用它的東西時,就是,就好像你自己在那裏鍵入了它一樣。所以你使用WIDTH_OFFSET的地方是6;取而代之 - 這當然不是你的意圖。所以只需刪除分號。

2

基本上,宏是方便的函數,由預處理器內聯放置。所以你可以認爲他們正在複製/粘貼匹配的條目,在你的情況下,它將取代WIDTH_OFFSET與的任何偶然性,就像其他人說的那樣,刪除分號;,你就全部設置好了。

此外,定義了簡單的數學函數宏時,remeber把它們放在括號()否則,你可以用一些數學運算順序錯誤結束(如除了之前無意部乘積)