Verlinken mit C++
-
int main() { http://www.google.de goto http; return 0; }Warum geht das Programm bei mir nicht, aber hier?
-
int main() { http: ShellExecute(0, "Open", "www.google.de", 0, 0, 1); goto http; return 0; }Probier doch das mal aus?

-
foren coder schrieb:
[...]
Warum geht das Programm bei mir nicht, aber hier?Weil das goto in C/C++ nichts mit Internetseiten zu tun hat.
Wie man eine Internetseite mit C++ öffnen kann hat martin_salo schon geschrieben. Ich würde aber das goto ganz wegnehmen:
int main() { ShellExecute(0, "Open", "<Interneadresse>", 0, 0, 1); return 0; }Unabhängig davon ist goto etwas was man nur benutzen sollte wenn es wirklich nicht anders geht.
-
foren coder schrieb:
int main() { http://www.google.de goto http; return 0; }[/url]
Warum geht das Programm bei mir nicht, aber hier?Was heißt hier geht nicht? Sollte doch ne schöne endlosschleife ergeben oder?

Beliah schrieb:
Unabhängig davon ist goto etwas was man nur benutzen sollte wenn es wirklich nicht anders geht.
Da bin ich nicht deiner Meinung. Hier ist es Natürlich nicht sehr Sinnvoll eingesetzt, aber ich halte es nicht für gut, wenn man nur wegen eines Trends oder "Weil mans halt nicht macht" auf ein vollkommen legitimes Sprachmittel verzichtet.
Klar kann man mit goto so manche Programme komplett unlesbar machen. Aber in manchen Fällen ist goto nicht nur erlaubt sondern schlicht und einfach eleganter als alle anderen Lösungen.
-
Beliah schrieb:
Unabhängig davon ist goto etwas was man nur benutzen sollte wenn es wirklich nicht anders geht.
Und es geht so ziemlich immer anders

DrPhil_Guth schrieb:
Aber in manchen Fällen ist goto nicht nur erlaubt sondern schlicht und einfach eleganter als alle anderen Lösungen.
Goto ist nie elegant. Ein goto ueber kleine Bereiche ist unnoetig und anders loesbar, und ein goto ueber groessere Bereiche hinweg bricht die Programmstruktur auf. Und wenn die Programmstruktur bricht, dann bricht der Programmierer der den Mist warten muss.
-
pumuckl schrieb:
Goto ist nie elegant. Ein goto ueber kleine Bereiche ist unnoetig und anders loesbar, und ein goto ueber groessere Bereiche hinweg bricht die Programmstruktur auf. Und wenn die Programmstruktur bricht, dann bricht der Programmierer der den Mist warten muss.
goto soll man nicht in oo c++ benutzen .
in c geht in vielen faelen mit goto eleganter ( z.B.linux kernel sources)
-
zeig mal jemand ein beispiel, wo goto eleganter ist als bspw. ne schleife!?
-
verschachtelte Schleifen
(das ist so ziemlich die einzige Situation, wo ich ein goto zweckmäßig einsetzen würde)while(bed1) { ... while(bed2) { ... if(fataler_fehler()) goto full_break; ... } ... } full_break: //vs while(bed1) { bool fatal=false; ... while(bed2) { ... if(fataler_fehler()) { fatal=true; break; } ... } if(fatal)break; ... }
-
Standardbeispiel:
dev = open(device); if (dev != NULL) { if (check1) { if (check2) { if (check3) { aktion; } else return CHECK3FAILED; } else return CHECK2FAILED; } else return CHECK1FAILED; close(dev); } else return OPENFAILED;In C gibt es keine Destruktoren, damit ist es u.U. notwendig nach jeder Aktion einen Punkt zum Aufräumen hinzuzufügen. Es gibt auch keine Exceptions, damit muss jeder Fehlerfall an Ort und Stelle behandelt werden. Manche nutzen dafür Bäume wie oben, andere goto:
ret = 0; dev = open(device); if (dev == NULL) { ret = OPENFAILED; goto ende; } if (!check1) { ret = CHECK1FAILED; goto close_und_ende; } ... close_und_ende: close(dev); ende: return ret;
-
@BorisDieKlinge als eine schleife? ich denke, den fall gibt es nicht.
es kann aber durchaus sinnvoll sein, gotos zu benutzen. allerdings beschränkt es sich im großen und ganz auf zwei fallkategorien. zum einen können sie erhebliche probleme im bereich der code-generierung vermeiden (siehe lex, flex, bison und co. nicht nur deren c-varianten sondern auch die c++-varianten) und zum anderen kann man sie sinnvoll nutzen, wenn man nur einen sehr kleinen stack hat, wie es im bereich der mikrokontroler vorkommt.
allerdings ist es hier auch zu beachten, was pumuckl geschrieben hat: die templates von code-generatoren zu verstehen oder gar warten zu können, ist wirklich harte arbeit. bei den mikrokontrollern ist es ähnlich, allerdings bleibt da normalerweise die codegröße in einem in sinnvoller zeit verstehbaren rahmen. (also zumindest bei solchen controllern, bei denen man auf menge an calls achten muss.
)als dritter bereich kommt dann noch die performance-steigerung hinzu. allerdings ist hier der effekt nicht sonderlich groß, da call+ret(f) nur unwesentlich "teurer" ist als zwei jmp. in dem bereich sollte man aus meiner sicht, in den meisten fällen die fingen davon lassen.
p.s. du wolltest noch ein bsp, oder? schau dir mal das resultat eines bison oder yacc durchlaufes an. schau aber besser nicht zu genau hin.

@CStoll an der stelle würde ich exceptions werfen.
@LordJaxom das stimmt. in c braucht man sie wesentlich häufiger, wenn man hübschen code schreiben will.