【问题标题】:A macro highlighted as keyword: pascal突出显示为关键字的宏:pascal
【发布时间】:2011-09-17 23:24:42
【问题描述】:

在查看FunkyOverlayWindow 的示例代码时,我发现了一个非常有趣的声明:

pascal OSStatus MyHotKeyHandler(
    EventHandlerCallRef nextHandler,
    EventRef theEvent,
    void *userData
);

这里,pascal 突出显示为关键字(标准 Xcode 配色方案中的粉红色)。但我刚刚发现它是一个宏,有趣的是在文件 CarbonCore/ConditionalMacros.h 中定义为:

#define pascal

那么,它应该(或曾经)做什么?也许它在过去有什么特殊用途?

虽然这个讨论在这里可能不太适合,但如果这与答案有关,知道为什么 Apple 仍然使用 Carbon 会很有趣。我没有使用 Carbon 的经验,但是这段代码似乎设置了一个键盘事件处理程序,这让我想知道是否有任何优于 Cocoa 方法的优势。碳不会被彻底清除吗?

【问题讨论】:

    标签: objective-c c macos macos-carbon


    【解决方案1】:

    在 68k Classic Mac OS 运行时(例如,在 PowerPC x86 之前),C 和 Pascal 使用不同的调用约定,因此 C 应用程序在使用 Pascal 调用库时必须声明适当的约定约定(包括大多数操作系统)。该宏是在同时代的编译器(例如 MPW、Metrowerks、Think C)中实现的。

    在所有较新的运行时和所有现代编译器中,关键字不再被识别,因此ConditionalMacros.h 标头将其定义。该文件中有一些 cmets 可能有助于解释更多信息 - 如果您喜欢游戏,请通读它。

    【讨论】:

    • 谢谢,我没有阅读整个文件。现在我明白了为什么要使用 Carbon 热键 API,但是我无法理解一件事:编写此代码时,不再使用 pascal 约定,对吗?那么他们为什么把它放在那里呢? :-P
    • 是的,这是不太合理的部分。我最好的猜测是,作者刚在苹果公司工作了很长时间,一直没有摆脱将函数声明为pascal的习惯!
    • 旧习惯很难改掉,很多代码从 68k 转移到混合的 68k/PPC 环境,所以 pascal 关键字仍然存在。 Pascal 还可以使用 packed 指令来节省内存,这需要在 C 中进行一些花哨的步法才能读取。
    【解决方案2】:

    您遇到了调用约定

    x86 的帕斯卡调用约定是described here

    非常有趣的是,它被定义为空无,您注意到这意味着它不再被使用。这在过去的 x86 领域很常见,尤其是在 Microsoft Windows API 中,因为处理器能够在调用结束时使用其特殊的RET n 指令从堆栈中删除参数。使用 pascal 调用约定的函数有时是有利的,因为调用者没有在每次调用返回后显式调整堆栈指针。

    如果有人更了解为什么该宏仍然存在于代码库中,但被定义为离开并给你一个更好的答案,我会很乐意撤回这个。

    【讨论】:

    • 很有趣,我永远不会想到这与调用约定有关。如果它适用于 x86,它并没有那么旧——但如果我没记错英特尔 Mac 开始出现的时间,Carbon 已经被气馁了。那么为什么在 Carbon 标头中使用这个宏......是的,如果有人更好地记住这些事实,让我们等待,但请不要撤回这个答案:-)
    • 我用谷歌搜索了一些术语,如 CarbonLib、pascal、调用约定、x86、Mac 等。令人惊讶的是,那里很少。 O'Reilly Carbon 2001 年出版的第 6 章现已上线;它在代码示例中显示pascal,但文本中没有解释。我认为真正的原因是为了向后兼容:在 carbon 流行的过去,pascal 约定被使用,所以 Apple #为新应用程序定义它为空,这样旧的源代码就可以继续运行。只是一种预感,但对我来说很有意义。有人可以验证吗?
    • 谢谢雷。是的,这是有道理的,唯一没有道理的是他们为什么在这段代码中使用它......也许是一个笑话来检查人们是否可以看到并理解它? :-)
    猜你喜欢
    • 2017-10-18
    • 2012-02-10
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2013-04-07
    • 2016-06-16
    • 2014-03-07
    相关资源
    最近更新 更多