寻求对gcc和x27的澄清/理解;s标签作为值特征

寻求对gcc和x27的澄清/理解;s标签作为值特征,c,C,在一个小型嵌入式系统上工作时,我想尝试一些类似于C的协同程序,这些程序是通过switch/case/macro构造和gcc的标签作为值扩展实现的。因此,我提出了一些结构和函数以及一个模式,这样我就可以编写如下函数(只是一个测试/示例函数): 但是,GCC不喜欢原始的goto fiber->restore(restore是FiberContext的void*成员)。我的想法是,基本上,当我返回外部结构时,我会捕获要跳转到的标签,离开函数,然后返回并跳转到新标签 我认为,我得出的结论是GCC不知道如

在一个小型嵌入式系统上工作时,我想尝试一些类似于C的协同程序,这些程序是通过switch/case/macro构造和gcc的标签作为值扩展实现的。因此,我提出了一些结构和函数以及一个模式,这样我就可以编写如下函数(只是一个测试/示例函数):

但是,GCC不喜欢原始的
goto fiber->restore
restore
是FiberContext的void*成员)。我的想法是,基本上,当我返回外部结构时,我会捕获要跳转到的标签,离开函数,然后返回并跳转到新标签

我认为,我得出的结论是GCC不知道如何做到这一点,因为&&运算符生成一个绝对跳转地址,而不是一个相对于当前函数堆栈的跳转地址。因此,我无法安全地重用它,因为没有什么可说的,我不会用不同的堆栈深度调用这个函数

所以我的问题基本上是双重的。我对为什么它不能工作/编译的理解正确吗?或者是别的什么东西,如果是的话,我对这个功能有什么错?我正在使用gcc-std=gnu99编译

goto *(fiber->restore);

此外,堆栈深度与函数代码地址无关——只有共享库重定位才起作用(上面的页面还解释了如何很好地实现这一点)

goto *(fiber->restore);