19

如何goto跨不同的功能使用?例如:

int main() {
    // ....
    REACH:
    // ....
}
    
void function() {
    goto REACH;
}
4

4 回答 4

22

你不能在标准 C++ 中。C++ 语言标准 $6.6.4/1 起

goto 语句无条件地将控制转移到由标识符标记的语句。标识符应是位于当前功能中的标签(6.1)。

...或在标准 C 中。从 C 语言标准的 $6.8.6.1/1

goto 语句中的标识符应命名位于封闭函数某处的标签。goto 语句不应从具有可变修改类型的标识符范围之外跳转到该标识符范围内。

于 2013-06-28T04:37:20.033 回答
20

你不能在标准 C 中;标签是单个函数的本地标签。

最接近的标准等效项是setjmp()longjmp()函数对。

GCC 具有更广泛地支持标签的扩展。

于 2013-06-28T04:34:58.783 回答
5

对于 gcc:

#include <iostream>

void func(void* target){
    std::cout << "func" <<std::endl;
    goto *target;
}


int main() {
    void* target;
    auto flag = true;
l:
    std::cout << "label" <<std::endl;
    target = &&l;
    if (flag) {
        flag = false;
        func(target);
  }
}

请注意,这可能是未定义的行为

于 2017-06-30T09:47:37.263 回答
2

你不能。想想这个。有一个函数 A 递归调用另一个函数 B,而 B 又调用 A。现在,假设您将 goto 语句从 A 放到 B。现在的问题是您要转到 A 的哪个实例,哪个未定义. 此外,如果没有定义 A 的先前实例,则您会遇到更大的问题,即函数中没有标签之前存在的初始化变量。

#include "bits/stdc++.h"
int i=0;
A(){
run:
    B();
}
B(){
if(i==10)
    goto run;
i++;
A();
}
于 2019-06-15T12:04:15.327 回答