我在挖掘tweejump游戏的源代码时发现了这个宏。
#define ccp(__X__,__Y__) CGPointMake(__X__,__Y__)
对我来说cpp它只是CGPointMake的别名。为什么需要这个?
答案 0 :(得分:3)
只是:CGPointMake
的别名。写3个字符比9更容易。
答案 1 :(得分:3)
#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 Horizon计划提供了证据证明人类可以不一次成功地考虑三件事情,我特别注意简单的规则! - (
(帮助!格式化C预处理器源代码如#if ...
的简单方法是什么?{}不起作用,后退滴答无效,4个前导空格不起作用。它们都吃一些领先的#
字符)