Return value im Falle von Try-Catch

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
joggel

Return value im Falle von Try-Catch

Beitrag von joggel »

Hallo liebes Forum,

ich habe mal eine Frage.
Ich habe folgenden Code:

Code: Alles auswählen

bool DieKlasse::dieFunktion()
{
	try
	{
		/*
		 some code....
		*/
		
		return true;
	}
	catch(...)
	{
		// Benutzer wird benachrichtigt durch bspw. eine MessageBox
		// return false;
	}
}
Ich habe habe mal absichtlich das "return false" hier auskommentiert, der Kompiler meckert nicht.
Aber was wird dann zurückgegeben?
Nicht definiert?
Wieso meckert der Kompiler nicht?

So etwas habe ich nämlich in meinem Code gefunden :(

Gruß
Alexander Kornrumpf
Moderator
Beiträge: 2119
Registriert: 25.02.2009, 13:37

Re: Return value im Falle von Try-Catch

Beitrag von Alexander Kornrumpf »

Ich dachte immer dass es wenn die Ausnahme gefangen wird einfach nach dem catch weiter geht.
joggel

Re: Return value im Falle von Try-Catch

Beitrag von joggel »

Mh, ja... stimmt!
Also, laut Debugger wenn ich durchsteppe!
Aber der Kompiler meckert eben nicht, wenn ich danach kein "return ..." habe!

Also, ich werd mal den ganzen Code nach Try-Catch-Anweisungen kontrollieren.
Anscheinend habe ich das Prinzip von Exceptions nicht ganz verstanden.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Return value im Falle von Try-Catch

Beitrag von Krishty »

Alexander Kornrumpf hat geschrieben:Ich dachte immer dass es wenn die Ausnahme gefangen wird einfach nach dem catch weiter geht.
Du meinst: zuerst geht es in dem catch weiter und, falls das abschließt, dahinter.
joggel hat geschrieben:Anscheinend habe ich das Prinzip von Exceptions nicht ganz verstanden.
Doch, doch. Das Problem hat mit Ausnahmebehandlung nichts zu tun – Funktionen dürfen in C++ sehr wohl keinen Rückgabewert haben, das ist dann nur eben undefiniertes Verhalten (außer bei int main()). Ebenso möglich, aber vollständig definiert und saubere Praxis ist, dass die Funktion überhaupt nicht zurückkehrt indem sie innerhalb des catch-Blocks wieder eine Ausnahme wirft (und damit die Kontrolle an den nächstäußeren catch-Block übergibt) oder terminate() aufruft (und das Programm damit beendet). Und was nicht zurückkehrt, braucht auch nichts zurückzugeben.

Auf höchstem Warnlevel sollte dein Compiler normalerweise warnen; vielleicht hat er aber gesehen, dass in deinem catch-Block was werfen könnte und es dann irrtümlich als beabsichtigt abgetan. Oder ist zu dem Ergebnis gekommen, dass dein try-Block niemals was werfen kann.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Sternmull
Establishment
Beiträge: 264
Registriert: 27.04.2007, 00:30
Echter Name: Til
Wohnort: Dresden

Re: Return value im Falle von Try-Catch

Beitrag von Sternmull »

Dafür braucht man keine Exception. Ich hab es auch schon hin und wieder ohne geschafft eine nicht-void Funktion ohne explizites return zu verlassen. Hat mich auch gewundert warum mir der Compiler das nicht anmeckert, ich glaub es im VC9 eine Warnung. Nach ein bisschen Gegoogel bin ich hier gelandet, da wird erwähnt das es für den Compiler unmöglich sein kann alle möglichen Ablauf-Pfade einer Funktion zu erkennen. Das dürfte wohl der Grund sein warum es keine Fehler ist: Dann würde der Compiler einem auch Code verbieten der eigentlich legal ist, so wie es in dem Link für Java demonstriert ist :)
Alexander Kornrumpf
Moderator
Beiträge: 2119
Registriert: 25.02.2009, 13:37

Re: Return value im Falle von Try-Catch

Beitrag von Alexander Kornrumpf »

Krishty hat geschrieben:[Du meinst: zuerst geht es in dem catch weiter und, falls das abschließt, dahinter.
Mit "gefangen" meinte ich tatsächlich "gefangen und ohne weitere Probleme behandelt" und mit "catch" meinte ich den catch-Block. Was zugegeben sträflich unpräzise war.
joggel

Re: Return value im Falle von Try-Catch

Beitrag von joggel »

Ah, okay. Vielen Dank!

Trotzdem muss ich jetzt mal überall nach "catch-try"-blöcken suchen :( , und dort schauen, das die aufrufenden Funktionen sich da alle samt korrekt verhalten.
Oder besser gesagt: mal schauen, ob ich beim programmieren nicht geschlafen hab ^^
Florian Keßeler
Beiträge: 75
Registriert: 24.07.2002, 00:00
Wohnort: Bremen
Kontaktdaten:

Re: Return value im Falle von Try-Catch

Beitrag von Florian Keßeler »

Das ist ganz normales Verhalten. im GCC z.B. muss die Warnung bei fehlendem return explizit mit -Wreturn-type oder -Wall eingeschaltet werden.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Return value im Falle von Try-Catch

Beitrag von kimmi »

Beim höchsten Warnlevel von VC sollte da auch eine Warnung erscheinen. Ansonsten kann ich für so etwas auch Cpp-Check empfehlen.

Gruß Kimmi
joggel

Re: Return value im Falle von Try-Catch

Beitrag von joggel »

Negativ!
VisualStudio 2005, Warnstufe 4: Keine Warnung!
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Return value im Falle von Try-Catch

Beitrag von kimmi »

Ich bin ebenfalls erschüttert, VS2008 und CPPCheck finden das beide ebenfalls nicht. Vielleicht hilft da ein Lint-Lauf, mal sehen.

Gruß Kimmi
Jaw
Beiträge: 54
Registriert: 14.07.2004, 01:00
Wohnort: Raum Düsseldorf

Re: Return value im Falle von Try-Catch

Beitrag von Jaw »

Hm also bei solchen und ähnlichen Konstrukten bekomme ich in Java tatsächlich eine Fehlermeldung, dass der Rückgabetyp fehlt. Ich weiß nicht in welche Verschachtelungstiefe der die Pfade abdeckt, aber auf jeden Fall für den Hausgebrauch. Ich hatte auch noch kein Konstrukt an Schleifen, Bedingungen, try, catch, finally, throw oder sonstwas, wo er ein fehlendes return auf irgendeinem Pfad nicht bemerkt hätte.

Was der Compiler allerdings leider nicht merkt ist, wenn ein Pfad praktisch nicht zu erreichen ist. Mal primitiv gesagt

Code: Alles auswählen

public boolean doSomething()
{
	int i = 4;
	if( i < 10 )
	{
		return true;
	}
}
Da würde er meckern, weil er halt nicht merken kann, dass die Bedingung immer erfüllt wäre. Das nur so als Anekdote, son Fall hatte ich mal. Man spendiert ihm dann einfach den extra return und gut is.

-JAW
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Return value im Falle von Try-Catch

Beitrag von Krishty »

Jaw hat geschrieben:Was der Compiler allerdings leider nicht merkt ist, wenn ein Pfad praktisch nicht zu erreichen ist. Mal primitiv gesagt

Code: Alles auswählen

public boolean doSomething()
{
	int i = 4;
	if( i < 10 )
	{
		return true;
	}
}
Da würde er meckern, weil er halt nicht merken kann, dass die Bedingung immer erfüllt wäre. Das nur so als Anekdote, son Fall hatte ich mal. Man spendiert ihm dann einfach den extra return und gut is.
Interessant. Ich habe von Java gehört, dass es tote Pfaden hinter return, throw und system.exit zuverlässig erkennt und in diesem Fall meckert. Ändert sich dein Beispiel vielleicht, wenn du i final deklarierst?

Ach, und wth kam eigentlich diese Antwort noch nicht:
joggel hat geschrieben:Wieso meckert der Kompiler nicht?
Halteproblem.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joggel

Re: Return value im Falle von Try-Catch

Beitrag von joggel »

Krishty hat geschrieben: Ach, und wth kam eigentlich diese Antwort noch nicht:
joggel hat geschrieben:Wieso meckert der Kompiler nicht?
Halteproblem.
Uff, schwere Lektüre zum Montagmorgen... aber danke!!
Bis ich da alles durch habe, vergeht bestimmt ne Weile.
joggel

Re: Return value im Falle von Try-Catch

Beitrag von joggel »

Also, es entsetzt mich...
Ich habe bei Weitem den Link noch nicht durch, aber echt sehr interessant!
Es ist also unmöglich alle evtl. ProgrammPfade abzudecken, okay.
Ich meine, so einen simplen Code sollte doch für den Compiler durchschaubar sein:
Projekt besteht nur aus:

Code: Alles auswählen

// HalteProblem_2.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
//#include "stdafx.h"
#include <iostream>

bool test()
{
	try
	{
		return true;
	}
	catch(...)
	{

	}
}
int main(int argc, char* argv[])
{
	test();
	return 0;
}
Bei gcc meckert er also wenn man das entsprechende Flag angibt.
Was hat sich da MS gedacht...

Was ich auch noch lustig fand, auf Arbeit habe ich in meinem "Monster"-Projekt (jaa, Monster ^^) mal folgendes probiert:

Code: Alles auswählen

...
//Qt-Header und eigene eingebunden
int test()
{
}

int main(int argc, char* argv[])
{
 cout << test() << endl;
 // Meine Qt- Application ... weiß das jetzt leider nicht mehr!
  ....
}
Kein Fehler/Warnung bei Warnstufe 4!!
Aber okay, das kann ich mir noch so erklären, dass das Projekt so groß ist das der Compiler da eben irgendwo "aufgibt"..

Trotzdem: sehr wunderlich, für mich!

[Edit]
Leute, ich gebs auf...

Code: Alles auswählen

// HalteProblem_2.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
//#include "stdafx.h"
#include <iostream>
int main(int argc, char* argv[])
{
	int test(0);
	try
	{
		test=10;
		//return 0;
	}
	catch(...)
	{

	}
	//return test;
}
Ausgabe:
------ Erstellen gestartet: Projekt: HalteProblem_2, Konfiguration: Debug Win32 ------
Kompilieren...
HalteProblem_2.cpp
d:\programmierung\projekte\halteproblem_2\halteproblem_2\halteproblem_2.cpp(17) : warning C4100: 'argv': Unreferenzierter formaler Parameter
d:\programmierung\projekte\halteproblem_2\halteproblem_2\halteproblem_2.cpp(17) : warning C4100: 'argc': Unreferenzierter formaler Parameter
Das Buildprotokoll wurde unter "file://d:\Programmierung\Projekte\HalteProblem_2\HalteProblem_2\Debug\BuildLog.htm" gespeichert.
HalteProblem_2 - 0 Fehler, 2 Warnung(en)
========== Erstellen: 1 erfolgreich, Fehler bei 0, 0 aktuell, 0 übersprungen ==========
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Return value im Falle von Try-Catch

Beitrag von Krishty »

Bei einem simplen int test() { } hat das tatsächlich nichts mehr mit dem Halteproblem zu tun, dann haben die den Test entweder nicht implementiert oder bewusst abgeschaltet. Wenn Ausnahmen im Spiel sind, geben dann aber die meisten Compiler auf, das ist normal. Eine Ausnahme zu werfen und den catch-Block zu finden wird unter der Haube ans Betriebssystem dirigiert und der Compiler kann nicht vorhersagen, wie das handeln wird.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joggel

Re: Return value im Falle von Try-Catch

Beitrag von joggel »

Okay,
klingt einleuchted.
Aber das mit dem int test(){} das mache/schaue ich morgen nochmal, nicht das ich da jetzt blödzinn erzähle!!
joggel

Re: Return value im Falle von Try-Catch

Beitrag von joggel »

So, noch mal nachgeschaut.
Und ich hatte es doch noch recht in Erinnerung.
Sehr sehr seltsam...
Nicht mal mehr auf C++ kann man sich verlassen...

Aber eigentlich auch egal... muss man halt aufpassen was man schreibt.
Dennoch bringt mich das ins Krübeln.
Ist es die Natur der Sache, oder habe ich einfach extrem schlampig programmiert, das da der Compiler irgendwann nicht alle
ProgrammPfade "überblicken" kann?
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Return value im Falle von Try-Catch

Beitrag von Krishty »

Ganz abstrakt gesehen ist es völlig in Ordnung. Der Rückgabewert einer Funktion sagt nicht aus, was sie zurückgeben wird – er sagt lediglich aus, dass die Auswertung (lies: erreichen einer return-Anweisung) der Funktion diesen Typ ergeben muss. Ob diese Auswertung jemals durchgeführt oder durch throw, terminate(), Endlosschleife, Stapelüberlauf, Apokalypse oder Vergessen des returns verhindert wird, steht in den Sternen. Über die statische Analyse des Programmflusses sagt der C++-Standard schließlich nichts aus.

Dementsprechend liegt in der Pflicht des Typsystems lediglich, den Typ der return-Anweisung zu verifizieren. Ist keine da, muss auch nichts verifiziert werden. Und die Auswertung eines Funktionspfads ohne return ist eben implementation-defined.
joggel hat geschrieben:Nicht mal mehr auf C++ kann man sich verlassen...
Bild
Konnte man das, abgesehen von nach 1993 eingeführten Idiomen, jemals? Außer int main() { } ist da doch absolut nichts determinierbar. Aber das ist ja keine Schwäche.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Return value im Falle von Try-Catch

Beitrag von Krishty »

(Noch ein Post neben die Tüte gekotzt: Ich vergleiche C++-Programmierung in letzter Zeit immer mehr mit dem Versuch, eine vereinigte physikalische Theorie zu finden.

Wir haben da einmal die logische Ebene, die makroskopischen Beobachtungen in der Physik entspricht: Für Menschen relativ einfach nachvollziehbare Regeln, dass ein C++-Programm intuitiv das tut, was man von ihm verlangt. Zum Beispiel ein Wort auf dem Bildschirm ausgeben.

Dem gegenüber steht die bitweise Ebene, entsprechend der Quantenphysik, in der alles möglich und nichts vorhersagbar ist: Von der Größe der Datentypen über Padding und Laufzeitumgebung bis zur bitweisen Repräsentation einzelner Werte.

Auch die Nullpunktfluktuation als Ausdruck der Unschärferelation findet ihre perfekte Entsprechung: Während ich im makroskopischen Maßstab einfach vorhersagen kann, dass cout << 1 + 2; 3 ausgibt, nimmt die Unsicherheit zu, je kleiner die Teilaspekte des Programms werden. Betrachtet man ausschließlich den Operator +, so hat er ein fast unendliches chaotisches Potential, da weder die Größe der Operanden definiert ist, noch die Repräsentation im Einer-/Zweierkomplement / als bunte Steinchen, noch sonst irgendwas. Von der Gestalt der 3 in der Ausgabe ganz zu schweigen. Und das gilt auch für die Semantik der return-Anweisung.

Weiterhin gibt es immer die Möglichkeit, dass diese kontraintuitiv und indeterministisch miteinander interferierenden Quanten eines Programms beobachtbare Auswirkungen auf den Gesamtzustand haben. Wenn man aber nicht gerade alle Teilchen und Antiteilchen, die die Tastatur hergibt, mit dem Compiler ineinanderschießt, ist die Wahrscheinlichkeit dafür verschwindend gering.

Das Problem ist nun – metaphorisch –, dass ein Mensch, der in C++ eine Kathedrale bauen will, früher oder später damit anfängt, einen enorm komplexen Spalt zu fertigen, der bei Bestrahlung durch Interferenz von Materiewellen eine bis auf weit subatomare Ebene perfekte Kathedrale erzeugt, anstatt einfach Steine aufeinanderzuschichten.

So viel auch dazu, dass C++ Low-Level wäre.)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joggel

Re: Return value im Falle von Try-Catch

Beitrag von joggel »

Krishty,
was soll ich dazu sagen... :) .
Danke für deine Erklärung und Ausführung, auch das was neben die Tüte ging!
Werd das mal zur Kenntnis nehmen und ab und an mal wieder überfliegen...
Aber ziemlich krasser/interessenter Vergleich!
P.s.: "Don't think about till your brain falls out!"

Was ich eben auch durch den Link gefunden habe, dieser Gödelscher Unvollständigkeitssatz fand ich echt toll!!
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Return value im Falle von Try-Catch

Beitrag von Krishty »

joggel hat geschrieben:Was ich eben auch durch den Link gefunden habe, dieser Gödelscher Unvollständigkeitssatz fand ich echt toll!!
Ja, solche Querverweise gibt es zum Glück häufiger. Beispielsweise sind die Formeln der Informatik, mit denen Shannon die Entropie in Signalen maß und die in der Datenkompression eine große Rolle spielen, dieselben, mit denen man später in der Thermodynamik die Entropie hinter dem Ereignishorizont Schwarzer Löcher berechnen konnte. Gibt mir den Trost, dass nicht alle Probleme, gegen die ich programmiere, von menschlichem Mind selber erschaffene Scheinprobleme sind.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Return value im Falle von Try-Catch

Beitrag von eXile »

Noch ganz kurz etwas von mir:
Krishty hat geschrieben:
joggel hat geschrieben:Wieso meckert der Kompiler nicht?
Halteproblem.
Wenn keine Rekursion benutzt wird, und keine Schleifen mit variabler Endbedingung benutzt werden, ist die betreffende Teilsprache nicht Turing-mächtig. Nimmt man jetzt noch ein paar Hilfsmittel hinzu (Datentypen haben nur endlich viele Werte, d.h. wir sind nicht auf einer Real-RAM), kann dieses Problem sehr wohl statisch gelöst werden.

Nachtrag: Sehr gut, ich hätte mal den Link lesen sollen, da ist das ja viel besser dargestellt. Ich habe übrigens noch immer kein Internet, aber das gehört in den Jammer-Thread.
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: Return value im Falle von Try-Catch

Beitrag von BeRsErKeR »

joggel hat geschrieben:

Code: Alles auswählen

bool DieKlasse::dieFunktion()
{
	try
	{
		/*
		 some code....
		*/
		
		return true;
	}
	catch(...)
	{
		// Benutzer wird benachrichtigt durch bspw. eine MessageBox
		// return false;
	}
}
Hab hier nicht alles gelesen, aber ist doch klar, dass der Compiler hier nicht meckert, jedenfalls falls Optimierungen eingeschaltet sind. Ich würde mir eher Sorgen machen wenn der Compiler hier nicht feststellen könnte, dass sowohl der catch-Block als auch der Teil nach dem try/catch niemals aufgerufen werden können.

Bau ein throw über dem return ein oder einen Funktions-Call der eine Exception werfen kann und du wirst deine Warnung kriegen. ;)

Ansonsten wird da halt der Rest wegoptimiert.
Ohne Input kein Output.
joggel

Re: Return value im Falle von Try-Catch

Beitrag von joggel »

Naja, dieser Abschnitt der durch /* some code*/ beschrieben wurde, enthält ja ordentlich Code, wo es möglich wäre das Exception gewurfen werden. Das hat mich halt nur verwundert.
Alexander Kornrumpf
Moderator
Beiträge: 2119
Registriert: 25.02.2009, 13:37

Re: Return value im Falle von Try-Catch

Beitrag von Alexander Kornrumpf »

Ich glaube ihr habt euch da einfach hinsichtlich der Bedeutung von /*some code*/ missverstanden.
joggel

Re: Return value im Falle von Try-Catch

Beitrag von joggel »

Japp, glaube auch...
Btw:
Hab mir das Video noch garnicht angeschaut, aber ich schmeisse das jetzt einfach mal hier rein:
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: Return value im Falle von Try-Catch

Beitrag von BeRsErKeR »

joggel hat geschrieben:Naja, dieser Abschnitt der durch /* some code*/ beschrieben wurde, enthält ja ordentlich Code, wo es möglich wäre das Exception gewurfen werden. Das hat mich halt nur verwundert.
Hmm also bei mir verursacht der folgende Code schon eine Warnung im VS2008:

Code: Alles auswählen

void func()
{

}

bool blub()
{
	try
	{
		func();
		return true;
	}
	catch (const std::exception &e)
	{

	}
}
Gleiches gilt z.B. für printf-Aufrufe vorm return. Daher kann ich mir nicht wirklich vorstellen, dass /*some code*/ in der Lage ist Exceptions zu werfen. Die Frage ist ja nicht wieviel Code da steht, sondern was für Code. Wenn da nur Variablen zugewiesen werden ist klar, dass da keine Exception fliegt. Sobald Funktionsaufrufe ins Spiel kommen, sieht das ganze schon anders aus, solange sie nicht mit "throw()" gekennzeichnet sind.
Ohne Input kein Output.
joggel

Re: Return value im Falle von Try-Catch

Beitrag von joggel »

Also aufgefallen ist mir das, als ich in dem Try-Block Code hatte, der einige Funktionen aufruft, mit unterschiedlicher Tiefe (also, diese Funktionen haben auch wieder Funktionen aufgerufen mit ebenfalls möglichen Exception-Wurf.
Aber dann habe ich mal ein ganz simples Projekt erstellt und in der main-Funktion das nochmal, wie oben beschrieben, getestet.
Und da bekam ich weder eine Warnung (Warnstufe 4 VS2008) noch ein Error.
Aber das war nur mal rein interessehalber, das ich hier gefragt hatte.
Ein bisschen Aufpassen muss Ich ja auch und mich nicht nur auf den Compiler verlassen.
BTW:
Bei dieser Sache habe ich auch gemerkt, das ich die ganze Zeit mit Warnstufe 1 compiliert habe ^^.
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: Return value im Falle von Try-Catch

Beitrag von BeRsErKeR »

Naja ich will damit grundsätzlich sagen, dass der Compiler in der Regel auch warnt, wenn es Probleme geben könnte. Auch für deinen Fall macht er da alles richtig. Wobei ich auch schon die Erfahrung gemacht habe, dass Compiler mitunter sehr komische Sachen machen, z.B. Codeteile wegoptimieren, weil sie denken dass sie nicht gebraucht werden und wenn man sie dann nutzen will knallts. Also ist schon richtig ein wenig vorsichtig zu sein. In deinem Fall macht der Compiler (egal welcher) aber mMn genau das richtige.
Ohne Input kein Output.
Antworten