ELEVENWORDINLINE什么时候使用它?

lvp*_*lvp 9 c macros objective-c ios

我总是想知道我能用这样的东西做什么:

ONEWORDINLINE(w1)
TWOWORDINLINE(w1, w2)
THREEWORDINLINE(w1, w2, w3)
Run Code Online (Sandbox Code Playgroud)

取决于

TENWORDINLINE(w1, w2, w3, w4, w5, w6, w7, w8, w9, w10)
ELEVENWORDINLINE(w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11)
TWELVEWORDINLINE(w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12)
Run Code Online (Sandbox Code Playgroud)
  1. 如何使用这个宏?
  2. 什么时候使用它们?
  3. 为什么从1到12而不是......例如100?

Min*_*s97 10

那是古代Mac程序员长期死亡的技术,哨兵最好不要触及坟墓.但是,如果你有兴趣,我们去吧,勇敢的冒险家!

以下是#define直接来自Apple的相关内容:

#define ONEWORDINLINE(w1) = w1
#define TWOWORDINLINE(w1,w2) = {w1,w2}
#define THREEWORDINLINE(w1,w2,w3) = {w1,w2,w3}
/* ...etc... */
#define TWELVEWORDINLINE(w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12) = {w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12}
Run Code Online (Sandbox Code Playgroud)

现在来解释一下.

一个小小的历史课:回到过去的时代,Mac被用于(就像古老的)摩托罗拉68k一样,Apple以下面的高度紧凑和非常有用的方式设置了系统调用:他们将它们映射到以1010b(以)开头的单词(0xA),因为它们被摩托罗拉开发者保留用于此用途.这些系统调用及其映射称为此十六进制值的A-Traps(与"IT'S A TRAP!"无关,老实说).它们看起来像十六进制:( 0xA869这个例子是FixRatio(short numer, short denom)系统调用的A-Trap ).该技术最初是为Mac Toolbox API创建的.

当一个Mac上-68K靶向编译器(这应该设置TARGET_OS_MACTARGET_CPU_68K宏作为1TRUETARGET_RT_MAC_CFM作为0或者FALSE,BTW)看到了一个函数原型与分配(=后),它处理的原型指的是一个A-陷阱系统调用由赋值运算符右侧的A-Trap值表示,它可以是以0xA(0xA???)开头的单个整数字面单字值.所以,ONEWORDINLINE基本上是一种时髦的宏观方式,说"这是一个 A-Trap!".

那么,这是68k的sys-call函数原型声明的样子:

EXTERN_API(Fixed) FixRatio(short numer, short denom) ONEWORDINLINE(0xA869);
Run Code Online (Sandbox Code Playgroud)

这将被预处理为这样的事情:

extern Fixed FixRatio(short numer, short denom) = 0xA869;
Run Code Online (Sandbox Code Playgroud)

现在,你可能会想:如果我们用一个单词对系统调用进行索引,并且该单词被巨大的四分之一进行索引0xA,则最多只有4096个函数(实际上,实际上得多) -Traps实际上映射到相同的系统调用子例程,但具有不同的参数),这是怎么回事?嗯,显然,事实并非如此.这就是选择者进来的地方.

A-Traps like _HFSDispatch(0xA260)被称为"选择器",因为它们具有选择和调用由堆栈上的值确定的另一个子例程的工作.因此,当函数原型被"分配"一个单词整数文字的"数组"时,除了最后一个(称为选择器代码)之外的所有文件都被推入堆栈,最后一个被视为A -Trap选择器抓住推入堆栈的单词并调用相应的子程序.这种数组中的最大单词数为12,因为这对于Mac工具箱来说已经足够了.

TWOWORDINLINE通过TWELVEWORDINLINE处理选择器A-Traps.例如:

EXTERN_API(OSErr) ActivateTSMDocument(TSMDocumentID idocID) TWOWORDINLINE(0x7002, 0xAA54);
Run Code Online (Sandbox Code Playgroud)

将被预处理为类似的东西

extern OSErr ActivateTSMDocument(TSMDocumentID idocID) = {0x7002, 0xAA54};
Run Code Online (Sandbox Code Playgroud)

这里0x7002是选择器代码,0xAA54是选择器A-Trap.

所以,总而言之,如果你想为1994年以前运行在Motorola 68k上的Mac-s做一些编码,你只需要它.所以在这里并不真实;)

免责声明:我在理论上只知道这些东西,我可能在某处犯了错误.如果有这些东西有经验的老手,如果我出错了,请纠正我!

  • 简而言之:"何时使用它?" - "大约二十年前." (5认同)