2014-12-01 30 views
0

我有一个代码库,我需要得到跨碰到一些这样的事情的:#define ...方法调用。为什么?

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

为什么会有人这样做,而不是建立在执行的方法?似乎有这样一件奇怪的事情要做,但必须有一些好处。

+1

没有没有多大好处,别不使用宏,使用内联函数。 – 2014-12-01 22:55:52

+0

它获得了Unix时代的时间戳。我怀疑,因为它的Unix价值有一种倾向,认为它应该是一个宏观。物以类聚,人以群分。 – 2014-12-01 22:56:24

回答

0

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

它消除了调用函数的开销当函数仅仅是一个线long.It迫使其是内联的

几乎任何编译器都会使这个小的函数内联,所以没有一个很好的理由这样做。更多的是文体选择。这也很容易出错

+0

它并没有真正消除很多开销(编译器/链接器可以将其删除)。使用宏是为了内联函数可以完成的事情总是不好的。 – 2014-12-01 22:57:13

+0

你不能内联Objective-C方法,所以除非你把它变成一个实际的函数,否则它不会被内联,因此会一直发送一条消息。这样的代价总是很低,所以真的没有理由再这样使用'#define'了。 – 2014-12-01 22:58:05

0

High Order Blog: -

在某些情况下宏提供无法通过其他途径必要的功能。一个例子是,当代码执行时,您确实需要实际上拥有当前代码位置的上下文。

例如,我有一个简单的宏,我有时在调用Objective-C来记录某些方法被调用时使用。这是可以做到像这样:

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

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

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