宏宣言

时间:2012-03-23 19:06:48

标签: objective-c c

我在挖掘tweejump游戏的源代码时发现了这个宏。

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

对我来说cpp它只是CGPointMake的别名。为什么需要这个?

2 个答案:

答案 0 :(得分:3)

只是:CGPointMake的别名。写3个字符比9更容易。

答案 1 :(得分:3)

  1. cpp的类型较少,
  2. 有人可以更改映射,例如围绕调用包装一些调试
  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 Horizo​​n计划提供了证据证明人类可以一次成功地考虑三件事情,我特别注意简单的规则! - (

    (帮助!格式化C预处理器源代码如#if ...的简单方法是什么?{}不起作用,后退滴答无效,4个前导空格不起作用。它们都吃一些领先的#字符)