在一个小型嵌入式系统上工作时,我想尝试一些类似于C协程的东西,你可以用switch/case/macro构造和gcc标签作为值扩展来实现。所以,我想出了一些结构和功能和模式,这样我可以写功能,如下面的(只是一个测试/例子功能):寻求澄清/理解gcc的标签作为价值特征
void fiber1(FiberContext *fiber)
{
if (fiber->restore) goto fiber->restore; // initial jump if called for
stateA:
printf("Fiber 1: A state\n");
fiber->misc = &&stateB;
fiber->restore = &&sleep;
return;
stateB:
printf("Fiber 1: A state\n");
fiber->misc = &&stateA;
fiber->restore = &&sleep;
return;
sleep:
fiberSleepTicks(fiber, 1000000);
fiber->restore = fiber->misc ? fiber->misc : &&stateA;
return;
}
但是GCC不喜欢原来的goto fiber->restore
(restore
是无效* FiberContext的成员)。我的想法基本上是,当我在外部结构中返回时离开函数,然后返回并跳转到新标签,我会捕获标签以跳转到该标签。
我想,我已经得出结论,GCC不知道该怎么做,因为运算符产生绝对跳转地址,而不是相对于当前函数堆栈的地址。所以我无法安全地重用它,因为没有什么可以说我不会用不同的堆栈深度调用这个函数。
所以我的问题基本上是双重的。我的理解是为什么它不工作/编译?或者是其他的东西,如果是这样,我在做什么错误的功能呢?我正在编译gcc -std=gnu99
。
太棒了!谢谢!激动它可以工作。 :) –