【问题标题】:#define ... method call. Why?#define ... 方法调用。为什么?
【发布时间】:2014-12-01 22:49:53
【问题描述】:

我在需要处理的代码库中遇到了一些这样的事情:

#define TimeStamp [NSString stringWithFormat:@"%d",(int)([[NSDate date] timeIntervalSince1970]) ]

为什么有人会这样做,而不是在实现中创建一个方法?这样做似乎很奇怪,但它一定有一些好处。

【问题讨论】:

  • 不,没有太大的好处,不要使用宏,使用内联函数。
  • 它正在获取 Unix 纪元时间戳。我怀疑由于它是 Unix 值,因此倾向于认为它应该是宏。不同的人有不同的笔画。

标签: objective-c xcode c-preprocessor


【解决方案1】:

根据High Order Blog:-

在某些情况下,宏提供了其他方式无法提供的必要功能。一个例子是当你确实需要在代码执行时实际掌握当前代码位置的上下文。

例如,我有一个简单的宏,有时我会在调试 Objective-C 时使用它来记录调用某些方法时的日志。可以这样做:

NSLog(@"%@: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));

这不能移动到 Objective-C 方法中,因为它总是会记录该方法的名称。 (很明显,它不能移动到 C 方法中,因为没有可用的 self 和 _cmd 变量。)为此创建一个宏很简单,但是:

#define LOG_SELECTOR()  NSLog(@"%@: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));

【讨论】:

    【解决方案2】:

    我见过很多用 C 做的,它只是使代码内联而不是在单独的函数中

    当函数只有一行时,它消除了调用函数的开销。它强制它内联

    几乎任何编译器都会将这么小的函数变成内联函数,因此没有一个很好的理由这样做。更多的风格选择。也很容易出错

    【讨论】:

    • 它并没有真正消除太多开销(编译器/链接器无论如何都可以消除它)。使用宏用于内联函数可以完成的事情总是不好的。
    • 你不能内联Objective-C方法,所以除非你把它变成一个实际的函数,否则它不会被内联,因此会一直发送消息。这样的成本是历史最低的,所以真的没有理由再像这样使用#define了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2018-03-26
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多