#define ...方法调用。为什么?

时间:2014-12-01 22:49:54

标签: objective-c xcode c-preprocessor

我在需要遇到的代码库中遇到过类似的事情:

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

为什么会有人这样做,而不是在实现中创建方法?看起来有点奇怪,但必须有一些好处。

2 个答案:

答案 0 :(得分:0)

我已经看到它在C中完成了很多,它只是使代码内联而不是单独的函数

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

几乎所有的编译器都会使这个小函数无论如何都能成为一个函数,所以这并不是一个很好的理由。更多的风格选择。它也非常容易出错

答案 1 :(得分:0)

根据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));