Предупреждение компилятора (уровни 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