我在挖掘 tweejump 游戏的源代码时发现了这个宏。
#define ccp(__X__,__Y__) CGPointMake(__X__,__Y__)
对我来说,cpp 只是 CGPointMake 的别名。为什么需要这个?
最佳答案
- cpp 更少打字,并且
- 有人可以更改映射,例如围绕调用进行一些调试
#ifndef 调试
#define ccp(__X__,__Y__) CGPointMake(__X__,__Y__)
#其他
#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 节目提供了证据表明人类不能同时成功地思考三件事!-(
(帮助!像 #if ...
这样格式化 C 预处理器源代码的简单方法是什么?{} 不起作用,反引号不起作用,4 个前导空格不起作用不行。他们都吃掉了一些前导的 #
字符)
关于objective-c - 宏声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9845100/