2012-12-06 41 views
2

在一个小型嵌入式系统上工作时,我想尝试一些类似于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->restorerestore是无效* FiberContext的成员)。我的想法基本上是,当我在外部结构中返回时离开函数,然后返回并跳转到新标签,我会捕获标签以跳转到该标签。

我想,我已经得出结论,GCC不知道该怎么做,因为运算符产生绝对跳转地址,而不是相对于当前函数堆栈的地址。所以我无法安全地重用它,因为没有什么可以说我不会用不同的堆栈深度调用这个函数。

所以我的问题基本上是双重的。我的理解是为什么它不工作/编译?或者是其他的东西,如果是这样,我在做什么错误的功能呢?我正在编译gcc -std=gnu99

回答