2013-10-28 36 views
1

的想法是設置幾個固定CGPoint值隨着宏,和在代碼讀取它們靈活(隨機地或與設置整數值)如何處理Objective-C宏名稱中的參數?

我具有限定這樣幾個CGPoints值的頭文件:

#define kSpawnPoint1 {550,20} 
#define kSpawnPoint2 {550,80} 
#define kSpawnPoint3 {200,175} 

我在1到3之間的代碼中生成一個隨機整數,並計劃根據整數值讀取宏中的CGPoint值。但不知道該怎麼做。在學習了關於預處理器的其他教程之後,我編寫了如下的代碼。

int tempInt = 1; 
CGPoint tempSpawnPoint = kSpawnPoint(temInt); 

但是它不工作。(有警告:未聲明的標識符 'kSpawnPointspawnPoint')

#define kSpawnPoint1 {550,20} 
#define kSpawnPoint2 {550,80} 
#define kSpawnPoint3 {200,175} 
#define kSpawnPoint(x) kSpawnPoint##x 
在M檔

我怎樣才能讓這對嗎?這是預先定義幾個CGPoint的正確方法嗎?我認爲我必須使用預處理器來實現這一點,考慮到未來多屏幕分辨率支持將更容易在宏中實現,並且我的kSpawnPoints不會與不同的屏幕分辨率相同。

回答

1

宏只對文本操作,而不對變量的值進行操作。當您編寫kSpawnPoint(an_int)時,預處理器將採用文字字符串「an_int」並將其粘貼,所以最終以kSpawnPointan_int結束。因此,你將不得不把文字數作爲參數,以便與您點中的一個結束:kSpawnPoint(1) - >kSpawnPoint1 - >{550, 20}

爲了您的宏中隨機選擇,你將不得不把它們變成一個結構將在運行時存在,如數組或switch語句。

+0

謝謝,這也是我的想法。但我看到一個這樣的例子: #define IS_LEAP_YEAR(y)y%4 == 0 && y%100!= 0 || y%400 == 0 int ys = 2012; if(IS_LEAP_YEAR(ys)){do something} 我測試過了,它工作正常。所以我認爲宏可以在運行時帶參數。你怎麼看待這件事? – ArtS

+0

這是有效的,因爲您並未嘗試使用僅在運行時存在的整數值來創建宏名稱,該宏名稱在預處理器階段後不再使用。宏的結果是一串算術,其中粘貼了字面變量名:'if(ys%4 == 0 && ys%100!= 0 || ys%400 == 0)',就好像你已經寫了手工編碼。 –

+0

我想我明白這一點。謝謝,這有助於我更多地瞭解宏如何工作! – ArtS