Предупреждение компилятора (уровни 1 и 3) C4793
"функция": функция скомпилирована как собственная: "причина"
Не удается скомпилировать функцию в управляемый код даже при включенном параметре компилятора /clr. Вместо этого отображается предупреждение компилятора C4793 и пояснительное сообщение, после чего выполняется компиляция функции в машинный код. В пояснительном сообщении описывается причина, по которой не удается скомпилировать функцию в MSIL.
Если задан параметр компилятора /clr:pure, это предупреждение имеет уровень 1.
В следующей таблице приведены все возможные причины возникновения этого сообщения.
Сообщение с описанием причины |
Примечания |
---|---|
Выровненные типы данных не поддерживаются в управляемом коде |
В среде CLR при необходимости должно обеспечиваться выделение памяти для данных, что в некоторых случаях невозможно при использовании объявлений вида __m128 или align. |
Функции, в которых используется параметр __ImageBase, не поддерживаются в управляемом коде |
Специальный символ компоновщика __ImageBase обычно используется только в низкоуровневом неуправляемом коде для загрузки библиотек DLL. |
varargs не поддерживается параметром компилятора /clr |
Из-за различных требований к размещению в стеке в неуправляемых функциях не поддерживается вызов управляемых функций, содержащих списки аргументов переменных (vararg). Поддержка списков аргументов переменных обеспечивается при заданном параметре /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
}
}
В следующем примере возникает предупреждение C4793.
// C4793_b.cpp
// compile with: /c /clr /W3
#include <setjmp.h>
jmp_buf test_buf;
void f() {
setjmp(test_buf); // C4793 warning
}