宏突出显示为关键字:pascal

时间:2011-09-17 23:24:42

标签: objective-c c macos macos-carbon

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

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

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

#define pascal

那么,它应该做什么(或者是什么)?也许它在过去有一些特殊用途?

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

2 个答案:

答案 0 :(得分:7)

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

在所有较新的运行时和所有现代编译器中,关键字不再被识别,因此ConditionalMacros.h标头将其定义。该文件中有一些评论可能有助于解释一下 - 如果你是游戏,请仔细阅读。

答案 1 :(得分:4)

您遇到了调用约定

x86的pascal调用约定是described here

非常有趣的是,它被定义为“无所谓”,你注意到它意味着它不再被使用了。过去在x86-land中很常见,特别是在Microsoft Windows API中,因为处理器能够在调用结束时使用特殊的RET n指令从堆栈中删除参数。具有pascal调用约定的函数有时是有利的,因为调用者在每次调用返回后都没有明确调整堆栈指针。

如果有更多知识为什么宏的人仍然存在于代码库中,但是已经定义了并且给出了更好的答案,我很乐意撤回这个。

相关问题