2012-03-23 76 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