我在挖掘tweejump遊戲的源代碼時發現了這個宏。宏聲明
#define ccp(__X__,__Y__) CGPointMake(__X__,__Y__)
對於我cpp這只是CGPointMake的別名。爲什麼需要這個?
我在挖掘tweejump遊戲的源代碼時發現了這個宏。宏聲明
#define ccp(__X__,__Y__) CGPointMake(__X__,__Y__)
對於我cpp這只是CGPointMake的別名。爲什麼需要這個?
#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預處理程序源代碼的簡單的方法{}沒有工作,反勾沒」!?他們都吃了一些領先的#
字符)
它只是:CGPointMake
的別名。這是很容易寫3個字比9
懶惰的編碼器:)) – OhDoh 2012-03-23 19:14:37
而且,更難以閱讀...... – 2012-03-23 19:25:48
當宏參數作爲參數傳遞給函數時,額外的括號會有什麼影響? – jamesdlin 2012-03-23 19:26:51
好的,回答我自己的問題,我聲稱他們並不重要,並且它是安全的。 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
關於函數調用的唯一時間是C++。 ','操作可以將兩個參數調用變爲三個參數調用,這可能會匹配替代簽名。但主要的觀點是不包含在括號中的宏參數可能很難找到錯誤,所以恕我直言,總是添加它們更簡單。正如您從我的Q&D調試代碼中看到的那樣,錯字或不同的優先運算符(低於&&)可能會引入錯誤。人們經常以現有的代碼作爲模型,重複這些模式,並添加小塊,所以恕我直言,開始安全有助於未來。好的? – gbulmer 2012-03-23 19:33:41