我做了这样的事情在my postscript interpreter。
这是来自我的操作员处理函数。它使用switch语句通过函数指针创建可变参数调用。
call: /* pass args bottom-up */
tos = siq; /* pop the stack to the 'stack in question' */
/* room for output? */
if (tos-os + op.sig[i].out > OSSIZE) error(st,stackoverflow);
switch (op.sig[i].n) {
case 0: op.sig[i].fp(st); break;
case 1: op.sig[i].fp(st, siq[0]); break;
case 2: op.sig[i].fp(st, siq[0], siq[1]); break;
case 3: op.sig[i].fp(st, siq[0], siq[1], siq[2]); break;
case 4: op.sig[i].fp(st, siq[0], siq[1], siq[2], siq[3]); break;
case 5: op.sig[i].fp(st, siq[0], siq[1], siq[2], siq[3], siq[4]); break;
case 6: op.sig[i].fp(st, siq[0], siq[1], siq[2], siq[3], siq[4], siq[5]); break;
default: error(st,unregistered);
}
我借用了Goswell interpreter (AKA Rutherford interpreter, AKA RALpage)这个技巧。
你好,但这太可怕了。为了规范,并且要求'FindFiles'是variadac,这使得它对规范的反应比我的建议更好,但是糟糕! – dmckee 2013-02-14 14:12:45
我的计划有很大的回报。运算符函数本身并不是可变参数,并且具有有意义的参数名称。在以前的版本中,每个op函数都直接操作堆栈(大量tos [-1],tos [-3])。 – 2013-02-19 18:50:37