在一個小型嵌入式系統上工作時,我想嘗試一些類似於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
。
太棒了!謝謝!激動它可以工作。 :) –