컴파일러 경고(수준 1 및 3) C4793
'function': 함수가 네이티브 코드로 컴파일됩니다. 'reason'
설명
/clr 컴파일러 옵션이 지정된 경우에도 컴파일러는 함수를 관리 코드로 컴파일할 수 없습니다. 대신 컴파일러는 경고 C4793 및 설명 연속 메시지를 내보낸 다음 함수를 네이티브 코드로 컴파일합니다. 연속 메시지에는 함수를 컴파일할 수 없는 이유를 설명하는 이유 텍스트가 MSIL
포함되어 있습니다.
/clr:pure 컴파일러 옵션을 지정할 때 수준 1 경고입니다. /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 가상 함수 thunk는 네이티브로 컴파일되어야 합니다. | 비 __clrcall 가상 함수 thunk는 관리되지 않는 주소를 사용해야 합니다. |
'_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