Поделиться через


Предупреждение компилятора (уровни 1 и 3) C4793

Function: функция компилируется как машинный код: "причина"

Замечания

Компилятор не может компилировать функцию в управляемый код, даже если указан параметр компилятора /clr . Вместо этого компилятор выдает предупреждение C4793 и пояснительное сообщение продолжения, а затем компилирует функцию в машинный код. Сообщение продолжения содержит текст причины , в котором объясняется, почему функция не может быть скомпилирована MSILв .

Это предупреждение уровня 1 при указании параметра компилятора /clr:pure . Параметр компилятора /clr:pure не рекомендуется использовать в Visual Studio 2015 и не поддерживается в Visual Studio 2017.

В следующей таблице перечислены все возможные сообщения о продолжении.

Сообщение о причине Замечания
Выровненные типы данных не поддерживаются в управляемом коде Среда CLR должна иметь возможность выделять данные по мере необходимости, что может быть невозможно, если данные соответствуют объявлениям, таким как __m128 или выравнивание.
Функции, использующие "__ImageBase", не поддерживаются в управляемом коде __ImageBase — это специальный символ компоновщика, который обычно используется только низкоуровневый машинный код для загрузки библиотеки DLL.
varargs не поддерживается параметром компилятора /clr Собственные функции не могут вызывать управляемые функции, имеющие списки аргументов переменных (varargs), так как функции имеют разные требования к макету стека. Однако если указать параметр /clr:pure компилятора, списки аргументов переменной поддерживаются, так как сборка может содержать только управляемые функции. Дополнительные сведения см. в разделе "Чистый и проверяемый код" (C++/CLI).
64-разрядная среда CLR не поддерживает данные, объявленные с помощью модификатора __ptr32 Указатель должен иметь тот же размер, что и собственный указатель на текущей платформе. Дополнительные сведения см. в __ptr32 __ptr64.
32-разрядная среда CLR не поддерживает данные, объявленные с помощью модификатора __ptr64 Указатель должен иметь тот же размер, что и собственный указатель на текущей платформе. Дополнительные сведения см. в __ptr32 __ptr64.
Одна или несколько встроенных функций не поддерживаются в управляемом коде Имя встроенной функции недоступно во время отправки сообщения. Однако встроенная, которая вызывает это сообщение, обычно представляет низкоуровневую инструкцию компьютера.
Встроенная собственная сборка ("__asm") не поддерживается в управляемом коде Встроенный код сборки может содержать произвольный машинный код , который нельзя управлять.
Не __clrcall виртуальная функция должна быть скомпилирована как собственная Не __clrcall виртуальная функция должна использовать неуправляемый адрес.
Функция с помощью "_setjmp" должна быть скомпилирована как собственная Среда CLR должна управлять выполнением программы. Однако функция setjmp проходит регулярное выполнение программы путем сохранения и восстановления низкоуровневых сведений, таких как регистры и состояние выполнения.

Пример

Следующий пример приводит к возникновению ошибки 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

Следующий пример приводит к возникновению ошибки 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