Teilen über


Compilerfehler C2712

Kann nicht in Funktionen verwendet werden __try , für die eine Objektentspannung erforderlich ist

Hinweise

Fehler C2712 kann auftreten, wenn Sie dies verwenden /EHsc, und eine Funktion mit strukturierter Ausnahmebehandlung verfügt auch über Objekte, die ein Abwickeln (Zerstörung) erfordern.

Lösungsvorschläge:

  • Verschieben Sie Code, der SEH benötigt, zu einer anderen Funktion.

  • Schreiben Sie Funktionen, die SEH verwenden, neu, um die Verwendung von lokalen Variablen und Parameter, die über Destruktoren verfügen, zu vermeiden. Verwenden Sie SEH nicht in Konstruktoren oder Destruktoren

  • Kompilieren ohne /EHsc

Fehler C2712 kann auch auftreten, wenn Sie eine mithilfe des __event Schlüsselworts deklarierte Methode aufrufen. Da das Ereignis in einer Multithreadumgebung verwendet werden kann, generiert der Compiler Code, der die Manipulation des zugrunde liegenden Ereignisobjekts verhindert, und schließt dann den generierten Code in eine SEH-Anweisung try-finallyein. Folglich wird Fehler C2712 auftreten, wenn Sie die Ereignismethode aufrufen und ein Argument, dessen Typ einen Destruktor enthält, als Wert übergeben. Eine Lösung besteht in diesem Fall darin, das Argument als konstanten Verweis zu übergeben.

C2712 kann auch auftreten, wenn Sie ein statisches Array von Zeiger-zu-Funktionen in einem /clr:pure Block kompilieren __try und deklarieren. Ein statisches Element erfordert, dass der Compiler die dynamische Initialisierung unter /clr:pureverwendet, was die C++-Ausnahmebehandlung impliziert. Eine C++-Ausnahmebehandlung ist jedoch in einem __try-Block nicht zulässig.

Die Compileroptionen /clr:pure und /clr:safe sind seit Visual Studio 2015 veraltet und werden in Visual Studio 2017 nicht unterstützt.

Beispiel

Im folgenden Beispiel wird beispielsweise der Fehlercode C2712 generiert und veranschaulicht, wie er behoben werden kann.

// C2712.cpp
// compile with: /clr:pure /c
struct S1 {
   static int smf();
   void fnc();
};

void S1::fnc() {
   __try {
      static int (*array_1[])() = {smf,};   // C2712

      // OK
      static int (*array_2[2])();
      array_2[0] = smf;
    }
    __except(0) {}
}