【问题标题】:Why the macros in Objective-C / Cocoa?为什么是 Objective-C / Cocoa 中的宏?
【发布时间】:2010-05-19 14:38:22
【问题描述】:

我来自一个没有宏 (Java/Python/C#/Scala) 的地方,所以也许我的观点被扭曲了,但是......

为什么在 Cocoa 中使用宏?我想到的两个是NSLocalizedStringNSAssert(和STAssert)。使它们起作用(可以内联)会很难/不适合吗?我想我觉得它们有点奇怪,因为它们是对 C 的不必要的回归(是的,我熟悉 Obj-C 的谱系)。

这只是过去发生的事情还是有特定原因?

【问题讨论】:

  • 宏有什么问题?宏是新的goto 邪恶吗?
  • 不再是这个-.- goto以适当的方式应用时并不邪恶。在某些情况下,它会导致比使用其他东西更简洁的代码(例如,一次中断几个 while、if、for 等。通常代码应该分成更多方法并返回使用,但goto 肯定有如果一个人知道他在做什么,那就是地方。

标签: objective-c macros


【解决方案1】:

一般来说最好避免使用宏,但对于NSAssert() 提供的功能,你不能。

如果你看一下定义,你会发现它使用了 __LINE____FILE___cmdself 从它使用的上下文中。如果它不是一个宏,它不会'无权访问该信息。

但是,对于NSLocalizedString,我认为没有明显的原因。

【讨论】:

  • Cocoa 版本只是映射到传递给[NSBundle mainBundle] 的消息,所以我看不到它。 @Deb
  • 是的,对于NSLocalizedString,除了重写函数参数之外似乎没有什么有趣的事情发生。
  • NSLocalizedString 实际上很好,因为它是一个宏,因为在定义全局 NSString const * 变量时,您可以用一个值初始化它们,并且仍然可以获得 genstrings exe 来翻译名称。我有两个包含文件“关闭/打开”我在这些全局变量或数组周围#include 的 NSLocalizedString。我有一个 16 种不同语言的相当复杂的应用程序,这非常有帮助。
  • @Brent:但您也可以使用映射到其中任何一个的宏 MyLocalizedString。我想说这比重新定义 Cocoa 宏更容易混淆 :) 研究它,它也被记录为一个函数 - 所以从技术上讲,我不认为它可以保证它仍然是一个宏。
【解决方案2】:

NSLocalizedString 是一个方便的宏,可能会成为一个函数。

但是,除了 Georg 的回答中给出的宏之外,NSAssert 和朋友是宏的充分理由。 NSAssert 计算一个布尔表达式以确定是否应该抛出异常。该布尔表达式可能在计算上非常昂贵,而不是您希望在发布代码中发生的那种事情。在 C(因此 Objective-C)中没有任何机制可以在不借助预处理器或可能使用类似以下的东西的情况下省略发布构建的正常函数调用:

if (debug)
{
    assertAsAFunction(foo == 3, "foo should be 3");
}

NSAssert 宏的另一个优点是可以将条件字符串化以在日志消息中使用。

【讨论】:

    猜你喜欢
    • 2014-01-17
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多