2009-02-16 9 views
17

Kann jemand die Ausnahmebehandlung in MSVC ausschalten? Ich habe versucht, die Option 'C++ Ausnahmen zu aktivieren' auf 'NEIN' und ich habe Warnung: Warnung C4530: C++ - Ausnahme-Handler verwendet, aber Abwicklungssemantik sind nicht aktiviert. Geben Sie /EHsc an.Wie kann ich die Ausnahmebehandlung in MSVC ausschalten?

Ich möchte auch den Exception-Handler ausschalten, aber ich weiß nicht wie.

In meiner Anwendung brauche ich grundsätzlich mehr Geschwindigkeit als Stabilität, daher habe ich mich entschieden, die Ausnahmebehandlung abzuschalten. Ich habe keine try/catch Blöcke, aber ich verwende STL. Wenn ich die Option "C++ Ausnahmen aktivieren" auf "NEIN" setze, gibt es eine Möglichkeit, diese Warnungen los zu werden?

Antwort

0

Haben Sie noch versuchen/catch Block (s) in Ihrem Code?

Das erste, was zu tun ist, wenn Sie nicht weiterkommen, ist, den Fehler auf MSDN und/oder Google nachzuschlagen. Das hilft normalerweise. Dies ist, was MSDN sagt:

When the /EHsc option has not been enabled, an object with automatic storage in the frame, between the function doing the throw and the function catching the throw, will not be destroyed. However, an object with automatic storage created in a try or catch block will be destroyed. [...]

2

Ausschalten von Ausnahmen ist ziemlich schwer, wie Sie mit C++ hier beschäftigen. Es ist wirklich in der gleichen Kategorie wie das Ausschalten von NULL-Pointern - wie geht man beispielsweise mit Speicherzuordnungsfehlern um?

Das sagte,/EH spezifiziert , die Exception Handling-Modell, das Sie wollen, und "keine" ist keine Option. Du kannst/EHa,/EHs,/EHac und/EHsc - [a] mit oder ohne Unterstützung für das Werfen externer C-Funktionen auswählen.

+0

hmm, ich bin nicht einverstanden damit. hat C++ nicht versprochen, keine Funktion zu haben, die du nicht willst (Ausnahmen, RTTI)? – didito

+0

@didito: Die Theorie ist, dass Sie nicht für sie zahlen, wenn Sie sie nicht verwenden.Aus diesem Grund gibt es keine Standardoption, um sie auszuschalten: Der Standard erwartet, dass sie kostenlos sind, wenn sie nicht verwendet werden, so dass es keinen Vorteil hätte, sie auszuschalten. (Ein typischer Weg, dies zu erreichen, ist ein tabellengesteuerter Mechanismus, der bedarfsgesteuert ist, wenn eine Ausnahme ausgelöst wird.) – MSalters

+4

Dies ist eine Troll-Antwort. Ich verwende keine Ausnahmen und Sie können sie ausschalten. Sie sind auch nicht gezwungen, die STL zu verwenden. Es ist nicht Teil der Sprache. – HaltingState

4

Diese Warnung bedeutet, dass Sie dem Compiler gesagt haben, dass Sie keine Ausnahmen verwenden werden, aber Sie haben einen try {} catch() {} Block im Code. Es informiert Sie, dass obwohl Sie diesen Block haben, keine Destruktoren ausgeführt werden, wenn eine Ausnahme ausgelöst wird. Das Ausschalten von Exceptions bedeutet genau das - der Compiler erzeugt keinen Code für die automatische Zerstörung, wenn der Stack im Falle einer Exception abgewickelt wird.

+0

Nun, ich habe den Code durchsucht, aber ich habe dort keine try/catch-Blöcke. Aber ich kreiere einige Klassen mit 'neu', trifft das auch zu? –

+2

Nein. Dies ist eine Compiler-Warnung, die beim Kompilieren einer einzelnen cpp-Datei angezeigt wird. Der Name der Datei erscheint kurz vor der Warnung. Das ist die Datei, die den fehlerhaften Code enthält. Im schlimmsten Fall können Sie Teile der Datei selektiv auskommentieren, um zu sehen, was die Warnung verursacht. – shoosh

22

Wahrscheinlich schließen Sie einen oder mehrere Standard-C++ - Header ein, die try/catch enthalten. Der typischste Fall wäre <iostream> - Sie erhalten diesen Fehler bei einer Datei, die nur aus einer einzigen Zeile besteht. Jeder andere Stream-Header wird auch tun, ebenso wie Locales.

Wenn Sie sich die Fehlermeldung genau anschauen, sollte sie auf zwei Dateinamen verweisen, nicht auf einen - Ihre Datei und die enthaltene Datei mit dem Fehler. Z.B. in meinem Beispiel Fall #include <iostream>, bekomme ich diese:

except.cpp 
C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocale(342) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc 
+4

Als eine Randnotiz, ich muss hinzufügen, dass es wirklich nicht so etwas wie ANSI/ISO C++ ohne Ausnahmen gibt - die Sprachspezifikation nicht einmal "Deaktivieren" sie, und die gesamte Standard-Bibliothek - einschließlich STL - Ausnahmen verwendet . Sogar die Behälter verwenden sie, z.B. std :: vector :: at() –

16

Wenn Sie in den STL Ausnahmen wollen, wirklich nicht _HAS_EXCEPTIONS = 0 in Ihrem gesamten Projekt definieren. Besser als den Code mit/EHsc zu kompilieren, wenn Sie keine Exception-Behandlung hinzufügen möchten.

+0

definieren _HAS_EXCEPTIONS 0 macht meine exe 4KB größer Das Aktivieren von Ausnahmen macht es noch einmal 4KB größer. Deaktivierung der Einstellung und _HAS_EXCEPTIONS 0 löscht die Warnung und hält die EXE kleiner. – slyy2048

Verwandte Themen