Erzwingt C ++ Rückmeldungen?

7

Okay, kleine Seltsamkeit, die ich mit meinem C ++ - Compiler entdeckt habe.

Ich hatte ein nicht allzu komplexes Code-Bit zum Refactoring, und ich schaffte es versehentlich, in einem Pfad zu bleiben, der keine return-Anweisung enthielt. Mein Fehler. Auf der anderen Seite, dies kompiliert und segfaulted, wenn ich es lief und dieser Pfad wurde offensichtlich getroffen.

Hier ist meine Frage: Ist das ein Compilerfehler, oder gibt es keine Garantie, dass ein C ++ - Compiler die Notwendigkeit einer Rückgabeanweisung in einer nicht void-Rückgabefunktion erzwingt?

Oh, und um klar zu sein, in diesem Fall war es eine unnötige if-Aussage ohne ein begleitendes anderes. Keine gotos, keine Ausgänge, keine Abbrüche.

    
deworde 06.07.2010, 14:18
quelle

3 Antworten

11

Ich persönlich denke, das sollte ein Fehler sein:

%Vor%

, aber die meisten Compiler behandeln es als Warnung, und Sie müssen möglicherweise sogar Compiler-Schalter verwenden, um diese Warnung zu erhalten. Zum Beispiel, auf g ++ brauchen Sie -Wall zu bekommen:

%Vor%

Natürlich sollte man mit g ++ immer mindestens mit -Wall kompilieren.

    
anon 06.07.2010, 14:24
quelle
13

Es gibt keine Garantie, dass ein C ++ - Compiler dies erzwingt. Eine C ++ - Funktion könnte durch Mechanismen, die dem Compiler unbekannt sind, aus seinem Kontrollfluss herausspringen. Kontextwechsel, wenn C ++ zum Schreiben eines Betriebssystemkerns verwendet wird, sind ein Beispiel dafür. Eine nicht abgefangene Ausnahme, die von einer aufgerufenen Funktion ausgelöst wird (deren Code dem Aufrufer nicht unbedingt zur Verfügung steht), ist eine andere.

Einige andere Sprachen, wie z. B. Java, erzwingen explizit, dass bei Vorhandensein von Wissen zur Kompilierzeit alle Pfade einen Wert zurückgeben. In C ++ ist dies nicht der Fall, wie es bei vielen anderen Gelegenheiten in der Sprache der Fall ist, wie das Zugreifen auf ein Array außerhalb seiner Grenzen auch nicht überprüft wird.

    
Johannes Schaub - litb 06.07.2010 14:21
quelle
4

Der Compiler erzwingt das nicht, weil Sie wissen, welche Pfade praktisch möglich sind, die der Compiler nicht hat. Der Compiler kennt normalerweise nur diese bestimmte Datei, nicht andere, die den Fluss innerhalb irgendeiner gegebenen Funktion beeinflussen können. Also, es ist kein Fehler.

In Visual Studio ist dies jedoch eine Warnung. Und wir sollten auf alle Warnungen achten ... richtig? :)

Bearbeiten : Es scheint eine Diskussion darüber zu geben, wann dies passieren könnte. Hier ist ein modifiziertes, aber echtes Beispiel aus meiner persönlichen Code-Bibliothek;

%Vor%

Bleib bei mir, denn das ist alter Code. Ursprünglich gab es dort eine "andere Rückkehr vielleicht". :) Wenn sich TestOne und TestTwo in einer anderen Kompilierungseinheit befinden, kann der Compiler, wenn er auf diesen Code trifft, nicht feststellen, ob TestOne und TestTwo beide für eine gegebene Eingabe den Wert false zurückgeben können. Sie, als der Programmierer, der TestOne und TestTwo schrieb, wissen, dass TestTwo erfolgreich sein wird, wenn TestOne fehlschlägt. Vielleicht gibt es Nebenwirkungen dieser Tests, also müssen sie gemacht werden. Wäre es besser, es ohne das "sonst wenn" zu schreiben? Könnte sein. Wahrscheinlich. Aber der Punkt ist, dass dies legales C ++ ist und der Compiler nicht wissen kann, ob es möglich ist, ohne eine Return-Anweisung zu beenden. Es ist, ich stimme zu, hässlich und nicht gut Codierung, aber es ist legal und Visual Studio wird Ihnen eine Warnung geben, aber es wird kompilieren.

Denken Sie daran, dass es in C ++ nicht darum geht, Sie vor sich selbst zu schützen. Es geht darum, dich tun zu lassen, was dein Herz innerhalb der Grenzen der Sprache wünscht, auch wenn das beinhaltet, sich selbst in den Fuß zu schießen.

    
Jere.Jones 06.07.2010 14:21
quelle