c - 寻求澄清/理解 gcc 的标签作为值(value)特征

标签 c

在一个小型嵌入式系统上工作时,我想尝试一些类似 C 协同程序的东西,你会发现它们是用 switch/case/macro 结构和 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 的 void* 成员)。我的想法基本上是,当我在外部结构中返回时,我会捕获要跳转到的标签,离开函数,然后返回并跳转到新标签。

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

所以我的问题基本上是双重的。我对为什么它不起作用/编译的理解是否正确?或者是别的什么,如果是这样,我在这个功能上做错了什么?我只使用 gcc -std=gnu99 进行编译。

最佳答案

尝试

goto *(fiber->restore);

http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html

此外,堆栈深度对于函数代码地址无关紧要 - 只有共享库重定位才重要(上面的页面也解释了如何很好地做到这一点)。

关于c - 寻求澄清/理解 gcc 的标签作为值(value)特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13751647/

相关文章:

c - 使用简单的unix管道

c++ - 函数参数中的按位或 (|)

使用 C 信号的精密计时器

c - 不加载 c 库的 perl 语法检查

c - 使用像 FILE* 这样的 C 字符串

objective-c - CGContextRef 作为 OpenGL 上下文

c - 递归方法不适用于二叉搜索树

c - 我应该检查 malloc() 是否成功吗?

c中将一个文件复制到另一个错误

c - 分配 : invalid block - Are Tcl_IncrRefCount and Tcl_DecrRefCount thread safe for threaded Tcl/1 interp per thread?