Instrukcja goto pomiędzy różnymi funkcjami

0

Witam wszystkich.
Podpowie mi ktoś czy istnieje sposób na użycie instrukcji goto pomiędzy różnymi funkcjami tzn. w jednej funkcji jest instrukcja goto, która przenosi nas do punktu, znajdującego się w innej funkcji? Ewentualnie, jeśli się nie da to czy istnieje jakiś odpowiednik tej instrukcji, którego możnaby użyć w tym celu? Jeśli na coś się te info przydadzą to używam Code::Blocks 13.12

8

Po co chcesz skakać do środka innej funkcji? Przecież to będzie bardzo mocno nieczytelne. Teraz może będziesz pamiętać, ale jak za pół roku wrócisz do tego kodu celem modyfikacji to będziesz się zastanawiać: "WTF co to ma być????". Jak chcesz zrobić coś takiego to wydziel ten kawałek gdzie chcesz skoczyć do oddzielnej funkcji i wywołaj z obydwu funkcji. O wiele bardziej eleganckie rozwiązanie.

0

Nie ma takiej możliwości, bo było by to dość skomplikowane dla kompilatora. Chodzi o to, że funkcja musi zadbać o to, aby usunąć odpowiednią ilość argumentów z pamięci. Jeśli skoczył byś w środek funkcji, to ta mogła by usunąć za dużo, lub za mało, a program by się wykrzaczył.
Lepiej dodaj dodatkowy argument do funkcji, do której chcesz skakać i jeżeli ten argument będzie miał określoną wartość, to omijasz część kodu.

4
hit02 napisał(a):

Nie ma takiej możliwości, bo było by to dość skomplikowane dla kompilatora.
Nie przesadzajmy. Kompilator robi o wiele bardziej skomplikowane rzeczy i jakoś mu to się udaje ;)

hit02 napisał(a):

Chodzi o to, że funkcja musi zadbać o to, aby usunąć odpowiednią ilość argumentów z pamięci. Jeśli skoczył byś w środek funkcji, to ta mogła by usunąć za dużo, lub za mało, a program by się wykrzaczył.
Z tym się zgodzę.

hit02 napisał(a):

Lepiej dodaj dodatkowy argument do funkcji, do której chcesz skakać i jeżeli ten argument będzie miał określoną wartość, to omijasz część kodu.
Ale z tym już nie za bardzo. Po co robić takie rzeczy? Takie zachowanie może sugerować, że funkcja wykonuje parę rzeczy. A to nie jest dobre rozwiązanie. Funkcje powinny być krótkie, robić 1 rzecz. Zatem jeśli coś jest wspólnego warto to wydzielić do innej funkcji. Ogólnie to takie gdybanie, jednak generalnie staram się trzymać takich zasad. Chyba, że ktoś pokaże mi argument, że w danym przypadku to nie ma sensu. A takie coś nie zdarzyło mi się.

0

Niebezpieczne, nieprzenośne, ale jak najbardziej wykonalne:
http://stackoverflow.com/questions/17357199/using-goto-function-across-different-functions

2

dam dziecku brzytwę (w sumie nie jestem pierwszy z tą brzytwą):
http://www.cplusplus.com/reference/csetjmp/longjmp/

0

Użyłem po prostu sposobu Mr.Yahoo. Btw próbowałem już wcześniej używać setjmp() i longjmp() ale pomiędzy funkcjami też mi to nie działało :(

4

Za używanie sjlj powinieneś dostać karę społeczna w postaci 5 lat przymusowej pracy w kamieniołomach.

3

@GilgameshX a wytłumacz mi proszę, jaki byłby wynik tego kodu:

#include <iostream>

void funkcjaA(int x) {
  cout << x;

mojaEtykietka:
  cout << 2 * x;
}

void funkcjaB() {
  goto mojaEtykietka;
}

int main() {
  funkcjaB();
}

I po dogłębnej analizie zastanów się, dlaczego niemożliwe jest skakanie w obrębie wielu scopów :P

Jeśli jakaś część funkcji się powtarza, powinieneś pójść za słowami @Mr.YaHooo i wydzielić dany fragment do odrębnej funkcji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1