/clr
제한
사용 시 다음과 같은 제한 사항에 유의하세요 /clr
.
구조적 예외 처리기에서는 컴파일
/clr
할 때 사용_alloca
제한이 있습니다. 자세한 내용은_alloca
를 참조하세요.런타임 오류 검사의 사용은 .에서
/clr
유효하지 않습니다. 자세한 내용은 방법: 네이티브 런타임 검사 사용표준 C++ 구문만 사용하는 프로그램을 컴파일하는 데 사용되는 경우
/clr
인라인 어셈블리 사용에 다음 지침이 적용됩니다.기본 스택 레이아웃에 대한 지식을 전제로 하며 현재 함수의 범위를 벗어난 규칙 또는 컴퓨터에 대한 기타 하위 수준 정보를 호출하는 인라인 어셈블리 코드는 해당 지식이 관리형 함수의 스택 프레임에 적용되면 실패할 수 있습니다. 인라인 어셈블리 코드가 포함된 함수는 관리되지 않는 함수
/clr
로 생성됩니다.복사 생성 함수 매개 변수를 전달하는 함수의 인라인 어셈블리 코드는 지원되지 않습니다.
으로 컴파일된
/clr
프로그램에서 함수vprintf
를 호출할 수 없습니다.에서
naked
__declspec
한정자가 무시됩니다/clr
.설정된
_set_se_translator
Translator 함수는 관리되지 않는 코드의 catch에만 영향을 줍니다. 자세한 내용은 예외 처리를 참조 하세요.에서 함수 포인터 비교는 허용되지
/clr
않습니다.완전히 프로토타입화되지 않은 함수의 사용은 다음에서
/clr
허용되지 않습니다.다음 컴파일러 옵션은 다음과 같이
/clr
지원되지 않습니다.전처리기 정의(
/D_STATIC_CPPLIB
)와 컴파일러 옵션의/clr
조합_STATIC_CPPLIB
은 지원되지 않습니다. 정의로 인해 애플리케이션이 지원되지 않는 정적 다중 스레드 C++ 표준 라이브러리와 연결되기 때문입니다. 자세한 내용은/LD /MT
/>(런타임 라이브러리 사용)을 참조/MD
하세요.함께
/clr
사용하면/Zi
성능에 영향을 줍니다. 자세한 내용은/Zi
를 참조하세요.문자를 지정
/Zc:wchar_t
하거나 캐스팅하지 않고 .NET Framework 출력 루틴에 와이드 문자를_wchar_t
전달하면 출력이unsigned short int
로 표시됩니다. 예시:Console::WriteLine(L' ') // Will output 32. Console::WriteLine((__wchar_t)L' ') // Will output a space.
/GS
은 함수가 아래에#pragma unmanaged
있거나 함수를/clr
네이티브 코드로 컴파일해야 하는 경우를 기준으로 컴파일할 때 무시됩니다. 이 경우 컴파일러는 기본적으로 꺼져 있는 경고 C4793을 생성합니다.관리되는 애플리케이션의 함수 서명 요구 사항을 참조
/ENTRY
하세요.단일 appdomain 프로세스에서만 컴파일된
/openmp
/clr
애플리케이션을 실행할 수 있습니다. 자세한 내용은 (OpenMP 2.0 지원 사용)을 참조/openmp
하세요.가변 인수 번호(varargs)를 사용하는 함수는 네이티브 함수로 생성됩니다. 가변 인수 위치의 관리되는 데이터 형식은 네이티브 형식으로 마샬링됩니다. 모든 System.String 형식은 실제로 와이드 문자열이지만 싱글 바이트 문자열로 마샬링됩니다. 따라서 지정자가
printf
%S
(wchar_t*
)이면 대신 문자열로%s
마샬링됩니다.매크로를 사용하는 경우 .으로
va_arg
/clr:pure
컴파일할 때 예기치 않은 결과가 발생할 수 있습니다. 자세한 내용은 , ,va_copy
va_end
va_start
를 참조하세요.va_arg
/clr:pure
/clr:safe
및 컴파일러 옵션은 Visual Studio 2015에서 더 이상 사용되지 않으며 Visual Studio 2017 이상에서는 지원되지 않습니다. “순수” 또는 “안전”해야 하는 코드는 C#으로 포팅해야 합니다.관리 코드에서 매개 변수 정보(함수 인수)를 가져오기 위해 스택을 안내하는 함수를 호출해서는 안 됩니다. P/Invoke 계층을 사용하면 해당 정보가 스택 아래로 더 내려갈 수 있습니다. 예를 들어 .을 사용하여 프록시/스텁
/clr
을 컴파일하지 마세요.가능한 경우에는 함수가 관리 코드로 컴파일되지만, 모든 C++ 구문을 관리 코드로 변환할 수 있는 것은 아닙니다. 이는 함수별로 결정됩니다. 함수의 일부를 관리 코드로 변환할 수 없는 경우 전체 함수가 대신 네이티브 코드로 변환됩니다. 다음은 컴파일러가 관리 코드를 생성하지 못하게 차단하는 사례입니다.
컴파일러에서 생성한 썽크 또는 도우미 함수. 네이티브 썽크는 가상 함수 호출을 포함하여 함수 포인터를 통해 모든 함수 호출에 대해 생성됩니다.
setjmp
또는longjmp
를 호출하는 함수특정 내장 루틴을 사용하여 머신 리소스를 직접 조작하는 함수. 예를 들어
__enable
및__disable
,_ReturnAddress
및_AddressOfReturnAddress
또는 멀티미디어 내장 함수를 사용하면 모두 네이티브 코드가 됩니다.#pragma unmanaged
지시문을 따르는 함수. (역,#pragma managed
또한 지원됩니다.)정렬된 형식,
__declspec(align(...))
을 사용하여 선언된 형식을 포함하는 함수