Aracılığıyla paylaş


Derleyici Uyarısı (düzey 1 ve 3) C4793

'function' : işlevi yerel kod olarak derlenmiş: 'reason'

Açıklamalar

/clr derleyici seçeneği belirtilse bile derleyici işlevi yönetilen kodda derleyemez. Bunun yerine, derleyici uyarı C4793 ve açıklayıcı bir devamlılık iletisi yayar ve ardından işlevi yerel koda derler. Devamlılık iletisi, işlevin neden olarak MSILderlenmediğini açıklayan neden metnini içerir.

Bu, /clr:pure derleyici seçeneğini belirttiğinizde bir düzey 1 uyarısıdır. /clr:pure derleyici seçeneği Visual Studio 2015'te kullanım dışıdır ve Visual Studio 2017'de desteklenmez.

Aşağıdaki tabloda tüm olası devamlılık iletileri listelenmektedir.

Neden iletisi Açıklamalar
Hizalanmış veri türleri yönetilen kodda desteklenmez CLR'nin verileri gerektiği gibi ayırabilmesi gerekir; bu, veriler __m128 veya hizalama gibi bildirimlerle hizalanırsa mümkün olmayabilir.
Yönetilen kodda '__ImageBase' kullanan işlevler desteklenmez __ImageBase genellikle dll yüklemek için yalnızca düşük düzeyli yerel kod tarafından kullanılan özel bir bağlayıcı simgesidir.
varargs, '/clr' derleyici seçeneği tarafından desteklenmiyor İşlevler farklı yığın düzeni gereksinimlerine sahip olduğundan, yerel işlevler değişken bağımsız değişken listelerine (varargs) sahip yönetilen işlevleri çağıramaz. Ancak , /clr:pure derleyici seçeneğini belirtirseniz, derleme yalnızca yönetilen işlevler içerebileceğinden değişken bağımsız değişken listeleri desteklenir. Daha fazla bilgi için bkz . Saf ve Doğrulanabilir Kod (C++/CLI).
64 bit CLR, __ptr32 değiştiricisi ile bildirilen verileri desteklemez İşaretçinin geçerli platformdaki yerel işaretçiyle aynı boyutta olması gerekir. Daha fazla bilgi için bkz . __ptr32, __ptr64.
32 bit CLR, __ptr64 değiştiricisi ile bildirilen verileri desteklemez İşaretçinin geçerli platformdaki yerel işaretçiyle aynı boyutta olması gerekir. Daha fazla bilgi için bkz . __ptr32, __ptr64.
Yönetilen kodda bir veya daha fazla iç bilgi desteklenmiyor İletinin yayılışı sırasında iç adı kullanılamaz. Ancak, bu iletiye neden olan bir iç genellikle düşük düzeyli bir makine yönergesini temsil eder.
Satır içi yerel derleme ('__asm') yönetilen kodda desteklenmiyor Satır içi derleme kodu , yönetilemeyen rastgele yerel kod içerebilir.
__clrcall olmayan bir sanal işlev thunk yerel olarak derlenmelidir __clrcall olmayan bir sanal işlev thunk yönetilmeyen bir adres kullanmalıdır.
'_setjmp' kullanan bir işlev yerel olarak derlenmelidir CLR'nin program yürütmeyi denetleyebilmesi gerekir. Ancak setjmp işlevi, yazmaçlar ve yürütme durumu gibi düşük düzeyli bilgileri kaydedip geri yükleyerek normal program yürütmesini atlar.

Örnek

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

// C4793.cpp
// compile with: /c /clr /W3
// processor: x86
int asmfunc(void) {   // C4793, compiled as unmanaged, native code
   __asm {
      mov eax, 0
   }
}
warning C4793: 'asmfunc' : function is compiled as native code:
        Inline native assembly ('__asm') is not supported in managed code

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

// C4793_b.cpp
// compile with: /c /clr /W3
#include <setjmp.h>
jmp_buf test_buf;

void f() {
   setjmp(test_buf);   // C4793 warning
}
warning C4793: 'f' : function is compiled as native code:
        A function using '_setjmp' must be compiled as native