Compiler Warning (level 1 and 3) C4793

 

The new home for Visual Studio documentation is Visual Studio 2017 Documentation on docs.microsoft.com.

The latest version of this topic can be found at Compiler Warning (level 1 and 3) C4793.

function' : function is compiled as native code: 'reason'

The compiler cannot compile function into managed code, even though the /clr compiler option is specified. Instead, the compiler emits warning C4793 and an explanatory continuation message, and then compiles function into native code. The continuation message contains the reason text that explains why function cannot be compiled to MSIL.

This is a level 1 warning when you specify the /clr:pure compiler option.

The following table lists all possible continuation messages.

Reason messageRemarks
Aligned data types are not supported in managed codeThe CLR must be able to allocate data as needed, which might not be possible if the data is aligned with declarations such as __m128 or align.
Functions that use '__ImageBase' are not supported in managed code__ImageBase is a special linker symbol that is typically used only by low-level native code to load a DLL.
varargs are not supported by the '/clr' compiler optionNative functions cannot call managed functions that have variable argument lists (varargs) because the functions have different stack layout requirements. However, if you specify the /clr:pure compiler option, variable argument lists are supported because the assembly can contain only managed functions. For more information, see Pure and Verifiable Code (C++/CLI).
The 64-bit CLR does not support data declared with the __ptr32 modifierA pointer must be the same size as a native pointer on the current platform. For more information, see __ptr32, __ptr64.
The 32-bit CLR does not support data declared with the __ptr64 modifierA pointer must be the same size as a native pointer on the current platform. For more information, see __ptr32, __ptr64.
One or more intrinsics is not supported in managed codeThe name of the intrinsic is not available at the time the message is emitted. However, an intrinsic that causes this message typically represents a low-level machine instruction.
Inline native assembly ('__asm') is not supported in managed codeInline assembly code can contain arbitrary native code, which cannot be managed.
A non-__clrcall virtual function thunk must be compiled as nativeA non-__clrcall virtual function thunk must use an unmanaged address.
A function using '_setjmp' must be compiled as nativeThe CLR must be able to control program execution. However, the setjmp function bypasses regular program execution by saving and restoring low-level information such as registers and execution state.

The following sample generates 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  

The following sample generates 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  

Show: