How can I use goto
across different functions? For example:
int main() {
// ....
REACH:
// ....
}
void function() {
goto REACH;
}
How can I use goto
across different functions? For example:
int main() {
// ....
REACH:
// ....
}
void function() {
goto REACH;
}
You can't in Standard C++. From $6.6.4/1 of the C++ Language Standard
The goto statement unconditionally transfers control to the statement labeled by the identifier. The identifier shall be a label (6.1) located in the current function.
...or in Standard C. From $6.8.6.1/1 of the C Language Standard
The identifier in a goto statement shall name a label located somewhere in the enclosing function. A goto statement shall not jump from outside the scope of an identifier having a variably modified type to inside the scope of that identifier.
You can't in Standard C; labels are local to a single function.
The nearest standard equivalent is the setjmp()
and
longjmp()
pair of functions.
GCC has extensions to support labels more generally.
You can't. Think of this. There is a function A which is recursively calling another function B which in turn is calling A. Now, suppose that you put a goto statement from A to B. The question now becomes which instance of A do you want to go to which is undefined. Also, if no previous instance of A is defined, you have a bigger problem of no initialized variables in the function that are present before the label.
#include "bits/stdc++.h"
int i=0;
A(){
run:
B();
}
B(){
if(i==10)
goto run;
i++;
A();
}
setjmp()
and longjmp()
, but these are slow and bring trouble when it comes to "stack" variables. The problem is for sake of convenience we've given up very useful functionality. The whole paradigm is flawed. –
Thoughtful For 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);
}
}
Note that this can be an undefined behavior
© 2022 - 2024 — McMap. All rights reserved.
setjmp
instead. – Pardogoto
is not always considered as a bad practice.goto
is very useful in C when you need to gracefully cleanup and exit from function. You can see manygoto
instructions in Linux kernel and many other huge projects. – Solicitousmain
to say for sure. – Durning