2012-03-23 67 views
1

我在挖掘tweejump遊戲的源代碼時發現了這個宏。宏聲明

#define ccp(__X__,__Y__) CGPointMake(__X__,__Y__) 

對於我cpp這只是CGPointMake的別名。爲什麼需要這個?

回答

3
  1. CPP少打字,和
  2. 有人可以改變映射,例如包裹通話

#ifndef DEBUG 周圍的一些調試
#define ccp(__X__,__Y__) CGPointMake(__X__,__Y__)
#else
#define ccp(__X__,__Y__) myassert2(((__X__) > 0),((__Y__) > 0), \
CGPointMake(__X__,__Y__))
#endif

我們爲什麼要這麼做?我們可以得到的錯誤具有錯誤行的源代碼:

#define myassert2(xc1, c2, fun) ((c1) && (c2)? fun((c1),(c2)): \ 
     fprintf(stderr, "Error in file %s, line %d, c1=%d c2=%d\", \ 
         __FILE__, __LINE__, (c1), (c2)) 

順便說一句,在總體上是一個宏安全始終包裹參數的括號:

#define ccp(__X__,__Y__) CGPointMake((__X__),(__Y__)) 

但作爲jamesdlin指出,在這種情況下的函數調用,沒關係。

恕我直言,最好有一個安全,易於解釋和記憶的「規則」,只有因強烈的原因而變化,而不是有一個更復雜的規則。畢竟,還有更多有趣的問題需要解決(在我的代碼中)是否要將宏的參數包含在括號中:-)

(我特別關注由於最近BBC地平線計劃提供的簡單規則證據表明,人類可以成功想三件事情在一次 - !(

(HELP什麼是格式化像#if ... C預處理程序源代碼的簡單的方法{}沒有工作,反勾沒」!?他們都吃了一些領先的#字符)

+0

當宏參數作爲參數傳遞給函數時,額外的括號會有什麼影響? – jamesdlin 2012-03-23 19:26:51

+0

好的,回答我自己的問題,我聲稱他們並不重要,並且它是安全的。 https://www.securecoding.cert.org/confluence/display/seccode/PRE01-C.+Use+parentheses+within+macros+around+parameter+names#PRE01-C.Useparentheseswithinmacrosaroundparameternames-Exceptions似乎同意。 – jamesdlin 2012-03-23 19:27:42

+0

關於函數調用的唯一時間是C++。 ','操作可以將兩個參數調用變爲三個參數調用,這可能會匹配替代簽名。但主要的觀點是不包含在括號中的宏參數可能很難找到錯誤,所以恕我直言,總是添加它們更簡單。正如您從我的Q&D調試代碼中看到的那樣,錯字或不同​​的優先運算符(低於&&)可能會引入錯誤。人們經常以現有的代碼作爲模型,重複這些模式,並添加小塊,所以恕我直言,開始安全有助於未來。好的? – gbulmer 2012-03-23 19:33:41

3

它只是:CGPointMake的別名。這是很容易寫3個字比9

+0

懶惰的編碼器:)) – OhDoh 2012-03-23 19:14:37

+0

而且,更難以閱讀...... – 2012-03-23 19:25:48