2012-12-06 55 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

回答