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


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