【问题标题】:How to write a macro that can take a parameter?如何编写一个可以带参数的宏?
【发布时间】:2009-09-03 20:28:50
【问题描述】:

我想使用一些 NSAssert 的东西和其他东西来更好地在我的应用程序中进行调试。 NSAssert 想要一个在断言失败时打印的字符串。很好,但除非你在那个字符串中输入一大堆信息,否则毫无用处,如果到处都是这样,可能会变得一团糟。

所以我想创建一个宏来执行 NSAssert 调用,其中包含一个包含类名、方法名和其他内容等有用信息的字符串。但更重要的是,我还想提供自定义评论。想象一下这样的宏:

USEFUL_ASSERT(foo != nil, @"那不好,真的")

由于很多原因,我不能在这里使用函数或方法调用,因为上下文会丢失并且我无法找出哪个类导致了该问题,哪个方法导致了该问题。这只能在该方法本身内部完成,因此我必须为这些信息传递大量参数,例如 [self class] 和 _cmd,但我不希望所有这些东西散落在各处。插入的代码越短,维护起来就越好。

有什么想法吗?

【问题讨论】:

  • 你是 RTFM 吗? (通常不是我的风格,但它你的用户名,毕竟)
  • 男人。 TFM 太大了,我一直在阅读。但我还需要六年才能完成所有事情。所以我尝试通过 SO 加速我的学习过程。

标签: iphone objective-c cocoa macros assert


【解决方案1】:

看看macro docs

【讨论】:

    【解决方案2】:
    #define USEFUL_ASSERT(condition, comment) /*whatever*/
    

    【讨论】:

    • 很好,看起来如果我可以使用条件,在宏的定义中注释?会试试的!完美。
    • 请记住,这是文本替换,而不是变量绑定,例如,如果你写 USEFUL_ASSERT(++x == 0, @"It's zero"),这意味着 x 将在宏体中每次出现 condition 时递增.
    • 因此,例如,如果宏主体是NSLog(@"%u is true? %@", (condition), (condition) ? @"YES" : @"NO"),则扩展为NSLog(@"%u is true? %@", (condition), (condition) ? @"YES" : @"NO")。注意这里有两个++x 表达式,所以x 增加了两次。
    • 很有意义。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 2013-07-01
    • 1970-01-01
    相关资源
    最近更新 更多