Sdílet prostřednictvím


Upozornění kompilátoru (úroveň 2) C4412

"funkce": obsahuje funkce podpis typu "typ"; C++ objekty jsou bezpečné předávání mezi čistý kód a kombinovaný nebo nativní.

Kompilátor zjištěn potenciálně nebezpečnou situaci, která by mohla způsobit chybu běhu: volání se provádí z /clr:pure souboru, určeného ke kompilaci, funkci, která byla importována přes dllimport a podpisu funkce obsahuje nebezpečný typ.Typ nebezpečné, pokud obsahuje členské funkce nebo datový člen, který je nebezpečný typ nebo dereference nebezpečný typ.

To je rozdíl mezi čistou a nativní kód konvence volání výchozí nebezpečné (nebo smíšené nativní a spravované).Při importu (prostřednictvím dllimport) do funkce /clr:pure souboru určeného ke kompilaci, zajistit, aby byly stejné jako v souboru určeného ke kompilaci, která exportuje funkce (přičemž obzvlášť opatrní o rozdílech v implicitní volání konvencí) prohlášení od každého typu v podpisu.

Virtuální členskou funkci je obzvláště náchylné k neočekávaným výsledkům. Virtuální funkce však musí být testovány pro zajištění, že získání správných výsledků.Pokud jste si jisti, že jste správné výsledky, můžete toto upozornění ignorovat.

Další informace o /clr:pure naleznete v tématu Postupy: Přechod na /clr:pure (C++/CLI).

Ve výchozím nastavení je vypnuto C4412.Další informace naleznete v tématu Upozornění kompilátoru, která jsou ve výchozím natavení vypnuta. a dllexport, dllimport.

Chcete-li vyřešit toto upozornění, odeberte všechny funkce z typu.

Příklad

Následující ukázka generuje upozornění C4412.

// C4412.cpp
// compile with: /c /W2 /clr:pure
#pragma warning (default : 4412)

struct Unsafe {
   virtual void __cdecl Test();
};

struct Safe {
   int i;
};

__declspec(dllimport) Unsafe * __cdecl func();
__declspec(dllimport) Safe * __cdecl func2();

int main() {
   Unsafe *pUnsafe = func();   // C4412
   // pUnsafe->Test();

   Safe *pSafe = func2();   // OK
}

Následující příklad je soubor hlaviček, který deklaruje dva typy.Unsafe Typu nebezpečné, protože má členskou funkci.

// C4412.h
struct Unsafe {
   // will be __clrcall if #included in pure compilation
   // defaults to __cdecl in native or mixed mode compilation
   virtual void Test(int * pi);

   // try the following line instead
   // virtual void __cdecl Test(int * pi);
};

struct Safe {
   int i;
};

V tomto příkladu exportuje funkce s typy definované v souboru hlaviček.

// C4412_2.cpp
// compile with: /LD
#include "C4412.h"

void Unsafe::Test(int * pi) {
   *pi++;
}

__declspec(dllexport) Unsafe * __cdecl func() { return new Unsafe; }
__declspec(dllexport) Safe * __cdecl func2() { return new Safe; }

Výchozí konvencí volání /clr:pure se liší od nativní sestavení kompilace. Pokud je zahrnuta, C4412.h Test bude výchozí pro __clrcall.Pokud zkompilujete a spustíte program (nepoužívejte /c), program vyvolá výjimku.

Následující ukázka generuje upozornění C4412.

// C4412_3.cpp
// compile with: /W2 /clr:pure /c /link C4412_2.lib
#pragma warning (default : 4412)
#include "C4412.h"

__declspec(dllimport) Unsafe * __cdecl func();
__declspec(dllimport) Safe * __cdecl func2();

int main() {
   int n = 7;
   Unsafe *pUnsafe = func();   // C4412
   pUnsafe->Test(&n);

   Safe *pSafe = func2();   // OK
}