MSVC ++ Fehler bei einer Division durch 0, die niemals passieren wird! Fix?

8
%Vor%

Sie erhalten einen Fehler in der Zeile, in der die Teilung erfolgt ist: "Fehler C2124: teile oder modiere durch Null"

was lahm ist, weil es ebenso unvermeidlich ist, dass die 'if' Prüfung fehlschlägt, da es die Division zu einem div durch 0 führt. Offen gesagt sehe ich keinen Grund für den Compiler, überhaupt irgendwas in der "wenn", außer um die Integrität der Zahnspange zu gewährleisten.

Wie auch immer, offensichtlich ist dieses Beispiel nicht mein Problem, mein Problem kommt, wenn ich komplizierte Template-Sachen mache, um so viel wie möglich zur Kompilierzeit zu machen, in einigen Fällen können die Argumente 0 sein.

gibt es trotzdem, um diesen Fehler zu beheben? oder deaktivieren Sie es? oder eine bessere Umgehungslösung als das:

Momentan ist die einzige Arbeit, die ich mir vorstellen kann (was ich schon einmal gemacht habe, als ich das gleiche Problem mit rekursivem enum-Zugriff hatte), die Template-Spezialisierung für das 'if' zu verwenden.

Oh ja, ich benutze Visual Studio Professional 2005 SP1 mit dem vista / win7 Fix.

    
matt 21.06.2010, 06:26
quelle

3 Antworten

4

Ich nehme an, Ihr Compiler versucht, das Code-Snippet zu optimieren, da bob const definiert ist, so dass der Anfangswert von fred zur Kompilierzeit bestimmt werden kann. Vielleicht können Sie diese Optimierung verhindern, indem Sie bob non-const deklarieren oder das Schlüsselwort volatile verwenden.

    
Ferdinand Beyer 21.06.2010 06:36
quelle
3

Können Sie genauer erläutern, was Sie mit Vorlagen tun möchten? Vielleicht können Sie eine spezialisierte Vorlage für 0 verwenden, die nicht wie im guten alten Faktorialbeispiel funktioniert und den Fehler vollständig vermeidet.

%Vor%     
Gary 21.06.2010 06:42
quelle
3

Das Problem - und der Compiler hat dabei keine Wahl - ist, dass bob wie auch 6 ein Integral Constant Expression ist. Daher ist 6 / bob auch ein ICE, und muss ausgewertet werden zur Kompilierzeit.

Es gibt eine sehr einfache Lösung: inline int FredFromBob(int bob) { return 6/bob; } - ein Funktionsaufruf-Ausdruck ist niemals ein ICE, selbst wenn die Funktion trivial ist und inline deklariert wird.

    
MSalters 21.06.2010 12:13
quelle