Bagikan melalui


Compiler Warning (level 1 dan 3) C4793

'fungsi' : fungsi dikompilasi sebagai kode asli: 'alasan'

Keterangan

Pengkompilasi tidak dapat mengkompilasi fungsi ke dalam kode terkelola, meskipun opsi pengkompilasi /clr ditentukan. Sebaliknya, kompilator memancarkan peringatan C4793 dan pesan kelanjutan penjelasan, lalu mengkompilasi fungsi ke dalam kode asli. Pesan kelanjutan berisi teks alasan yang menjelaskan mengapa fungsi tidak dapat dikompilasi ke MSIL.

Ini adalah peringatan tingkat 1 ketika Anda menentukan opsi kompilator /clr:pure . Opsi kompilator /clr:pure tidak digunakan lagi di Visual Studio 2015 dan tidak didukung di Visual Studio 2017.

Tabel berikut ini mencantumkan semua kemungkinan pesan kelanjutan.

Pesan alasan Keterangan
Tipe data yang diratakan tidak didukung dalam kode terkelola CLR harus dapat mengalokasikan data sesuai kebutuhan, yang mungkin tidak dimungkinkan jika data diselaraskan dengan deklarasi seperti __m128 atau selaras.
Fungsi yang menggunakan '__ImageBase' tidak didukung dalam kode terkelola __ImageBase adalah simbol linker khusus yang biasanya hanya digunakan oleh kode asli tingkat rendah untuk memuat DLL.
vararg tidak didukung oleh opsi pengkompilasi '/clr' Fungsi asli tidak dapat memanggil fungsi terkelola yang memiliki daftar argumen variabel (vararg) karena fungsi memiliki persyaratan tata letak tumpukan yang berbeda. Namun, jika Anda menentukan opsi pengkompilasi /clr:pure , daftar argumen variabel didukung karena rakitan hanya dapat berisi fungsi terkelola. Untuk informasi selengkapnya, lihat Kode Murni dan Dapat Diverifikasi (C++/CLI).
CLR 64-bit tidak mendukung data yang dideklarasikan dengan pengubah __ptr32 Penunjuk harus berukuran sama dengan pointer asli pada platform saat ini. Untuk informasi selengkapnya, lihat __ptr32, __ptr64.
CLR 32-bit tidak mendukung data yang dideklarasikan dengan pengubah __ptr64 Penunjuk harus berukuran sama dengan pointer asli pada platform saat ini. Untuk informasi selengkapnya, lihat __ptr32, __ptr64.
Satu atau beberapa intrinsik tidak didukung dalam kode terkelola Nama intrinsik tidak tersedia pada saat pesan dipancarkan. Namun, intrinsik yang menyebabkan pesan ini biasanya mewakili instruksi komputer tingkat rendah.
Rakitan asli sebaris ('__asm') tidak didukung dalam kode terkelola Kode rakitan sebaris dapat berisi kode asli arbitrer, yang tidak dapat dikelola.
Thunk fungsi virtual non-__clrcall harus dikompilasi sebagai asli Thunk fungsi virtual non-__clrcall harus menggunakan alamat yang tidak dikelola.
Fungsi yang menggunakan '_setjmp' harus dikompilasi sebagai asli CLR harus dapat mengontrol eksekusi program. Namun, fungsi setjmp melewati eksekusi program reguler dengan menyimpan dan memulihkan informasi tingkat rendah seperti register dan status eksekusi.

Contoh

Sampel berikut menghasilkan C4793.

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

Sampel berikut menghasilkan C4793.

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