我在挖掘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