C语言中有返回指令的跳转吗?

C语言中有返回指令的跳转吗?,c,C,我的代码中有多个位置,我希望能够跳转到一个特定的位置并返回到以前的位置 函数调用提供了控制流,但对我来说不是一个选项,因为我希望我分支的代码访问许多变量,并将所有变量作为参数传递给函数调用,这既不实用也不高效 而goto语句只是为了获取标签而构建的,也就是说,它应该是一张单程票 目前,我通过以下几点实现了我所需要的: void *return_addr; int x,y; ... return_addr=&&RETURN_0; goto SOMEWHERE; RETURN_0:

我的代码中有多个位置,我希望能够跳转到一个特定的位置并返回到以前的位置

函数调用提供了控制流,但对我来说不是一个选项,因为我希望我分支的代码访问许多变量,并将所有变量作为参数传递给函数调用,这既不实用也不高效

而goto语句只是为了获取标签而构建的,也就是说,它应该是一张单程票

目前,我通过以下几点实现了我所需要的:

void *return_addr;
int x,y;
...
return_addr=&&RETURN_0;
goto SOMEWHERE;
RETURN_0:
...
x+=1;
...
return_addr=&&RETURN_1;
goto SOMEWHERE;
RETURN_1:
...


SOMEWHERE:
y=x;
...
goto *return_addr;

还有更优雅、更简单的吗?

让我们将变量收集到一个结构中:

struct data_t {
    int a;
    int b;
    /* and so on */
    int x;
    int y;
};
让我们在函数中定义重复代码:

void func(struct data_t* data) {
    data->y = data->x;
    /* and so on */
}
让我们使用以下函数:

struct data_t data = {1, 2, ..., 24, 25};
func(&data);
data.x += 1;
func(&data);
/* and so on */
C有setjmp/longjmp,它可以支持您所描述的内容。不要使用它们。然而,更重要的是,不要依赖于您当前的方法,它不是标准的C,并且是非常糟糕的形式

您描述的是函数的用途。如果有大量数据必须在调用者和被调用者之间共享,则

将它们记录在文件范围变量中,以便两个函数都可以直接访问它们,或者 创建一个或多个用于保存和组织数据的复杂数据类型结构,并通过传递指向此类结构的指针来授予被调用方访问权限。
状态机可以这样编写:

typedef enum { start, stop, state1, ... } state;

state s = start;
while (s != stop) {
 switch (s) {
 case start:
   do_stuff; // lots of code
   // computed goto
   s = cond ? state23 : state45;
   break;
   ...
需要调用堆栈吗

 state stack[42]; int sp=0;
 ...
    do_stuff;
    stack[sp++] = state33;
    s = state45; // call
    break;
  case state33:

  case state45:
    do_processing; // some code
    s = stack[--sp]; // ret
    break;
只有在对时间关键型代码段进行基准测试并发现正常的函数调用机制确实是瓶颈之后,才应该这样做

有没有更优雅、不那么麻烦的东西

很明显,您正在使用GCC,因为是GCC扩展。使用GCC,我们可以使用和访问局部变量,而无需将它们作为参数传递:

{
    int x, y;

    void SOMEWHERE()
    {
        y = x;
        //...
    }

    //...
    SOMEWHERE();
    //...
    x += 1;
    //...
    SOMEWHERE();
    //...
}

这不是调用函数的全部内容吗?如果你想用Goto这么多,你应该考虑旧的1970的基本。为什么你基本上写汇编在C?使用函数。如果必须访问大量全局状态,请将相关部分放入结构中,并将指向该结构的指针传递给函数。如果您将函数标记为静态的,那么它们很可能是内联的,并有效地实现您想要做的事情;但还有一个额外的好处,那就是不要成为一场无法维护的灾难。只需将所有变量设置为全局变量,这样你就可以从任何地方访问它们。我的意思是,这个设计已经很糟糕了。没什么比这更糟的了。你知道建筑吗?一个结构收集所有相关变量,然后只传递该结构或指向它的指针。@dlask:在另一个注释中,他提到了缓存,因此CPU不能那么小。我认为OP要么有XY问题,要么从2000年开始就没有现代编译器的经验。另外,这听起来像是过早的优化,因为他没有提供任何证据证明干净的代码会太慢。我同意这是一种更干净的编码方式。我不采用这种方法,因为在内存带宽已经是瓶颈的系统上,每个变量访问都是另一个内存负载和/或存储。不清楚。无论如何,您必须访问您的变量。例如,如果将结构设置为全局结构,并直接从被调用函数访问变量,则变量访问时间没有差别。换句话说,你为什么不使用函数?@Lolo:你似乎下定决心不使用结构,并认为它们效率较低。理论上是这样的,但许多编译器已经找到了优化结构成员访问的聪明方法,它们的性能几乎与变量相同。你有没有研究过你的编译器在这种情况下会如何帮助你,比如你有哪些优化选项:例如内联函数和你的编译器的-fomit帧指针的等价物compiler@EliasVanOotegem是的,我确实会直接查看编译器生成的反汇编,以查看程序集与我所需的有多接近。内联函数并不是我想要的东西,原因和宏对我来说也不起作用一样:更大的代码会丢失缓存指令。每次访问时,结构都会在内存加载和存储中进行转换,这与我最终需要的并不相符。我经常使用到目前为止在这里建议的每一种方法—结构、宏和内联。这只是一个地方,所有这些都不能满足我的需要。@Lolo:只是简单介绍一下基本情况,我并不是说你没有看拆卸,只是尝试了一些橡胶垫:。尽管如此,我不确定我们是否能提供任何帮助。我开始觉得你在找人说你写的代码是可以接受的。也许在你非常特殊的情况下是这样,但我相信你会理解为什么它让我们大多数人畏缩:哇。我已经忘记了这个问题,我被狠狠地问了一顿。虽然我不再需要这种方法,但我相信你建议的方法正是我想要的。它实现了我描述的流程,不需要将变量设置为全局变量。