Share via


Derleyici Uyarısı (düzey 2) C4412

'function' : işlev imzası 'type' türünü içerir; C++ nesneleri saf kod ile karışık veya yerel arasında geçiş yapmak için güvenli değildir.

Açıklamalar

/clr:pure derleyici seçeneği Visual Studio 2015'te kullanım dışıdır ve Visual Studio 2017'de desteklenmez. Saf olması gereken kodunuz varsa, bunu C# olarak taşımanızı öneririz.

Derleyici, çalışma zamanı hatasına neden olabilecek güvenli olmayabilecek bir durum algıladı: /clr:pure compiland öğesinden dllimport aracılığıyla içeri aktarılan bir işleve çağrı yapılıyor ve işlev imzası güvenli olmayan bir tür içeriyor. Bir üye işlevi içeriyorsa veya güvenli olmayan bir tür veya güvenli olmayan bir türe dolaylı bir veri üyesine sahipse tür güvenli değildir.

Bu, saf ve yerel kod (veya karma yerel ve yönetilen) arasındaki varsayılan çağrı kurallarındaki fark nedeniyle güvenli değildir. bir işlevi /clr:pure compiland içine içeri aktarırken (aracılığıyladllimport), imzadaki her türün bildirimlerinin işlevi dışarı aktaran compiland'dakilerle aynı olduğundan emin olun (örtük çağrı kurallarındaki farklılıklar konusunda özellikle dikkatli olun).

Sanal üye işlevi özellikle beklenmeyen sonuçlar vermeye açıktır. Ancak, doğru sonuçları aldığınızdan emin olmak için sanal olmayan bir işlev bile test edilmelidir. Doğru sonuçları elde ettiğinizden eminseniz, bu uyarıyı yoksayabilirsiniz.

C4412 varsayılan olarak kapalıdır. Daha fazla bilgi için bkz . Varsayılan Olarak Kapalı Olan Derleyici Uyarıları ve dllexport, dllimport .

Bu uyarıyı çözmek için türündeki tüm işlevleri kaldırın.

Örnekler

Aşağıdaki örnek C4412 oluşturur.

// 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
}

Aşağıdaki örnek, iki tür bildiren bir üst bilgi dosyasıdır. Bir Unsafe üye işlevi olduğundan tür güvenli değil.

// 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;
};

Bu örnek, üst bilgi dosyasında tanımlanan türlerle işlevleri dışarı aktarır.

// 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; }

/clr:pure derlemesindeki varsayılan çağırma kuralı yerel derlemeden farklıdır. C4412.h eklendiğinde varsayılan Test olarak olarak __clrcallayarlanır. Bu programı derleyip çalıştırırsanız (/c kullanmayın), program bir özel durum oluşturur.

Aşağıdaki örnek C4412 oluşturur.

// 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
}