다음을 통해 공유


CRT의 전역 상태

UCRT(유니버설 C 런타임)의 일부 함수는 전역 상태를 사용합니다. 예를 들어 setlocale() 전체 프로그램의 로캘을 설정하여 숫자 구분 기호, 텍스트 코드 페이지 등에 영향을 줍니다.

UCRT의 전역 상태는 애플리케이션과 OS 간에 공유되지 않습니다. 예를 들어 애플리케이션이 호출 setlocale()하는 경우 C 런타임을 사용하는 OS 구성 요소의 로캘에 영향을 주지 않습니다.

OS 관련 버전의 CRT 함수

UCRT에서 전역 상태와 상호 작용하는 함수에는 접두사로 "쌍" 함수가 _o_있습니다. 예시:

  • setlocale() 는 앱과 관련된 전역 상태에 영향을 줍니다.
  • _o_setlocale() 는 앱이 아닌 모든 OS 구성 요소에서 공유하는 전역 상태에 영향을 줍니다.

이러한 "쌍" 함수의 유일한 차이점은 전역 CRT 상태를 읽고 쓸 때 OS 관련 버전(즉, 시작하는 _o_버전)이 앱의 전역 상태 복사본 대신 전역 상태의 OS 복사본을 사용한다는 것입니다.

이러한 함수의 OS별 버전은 .에 있습니다 ucrt.osmode.lib. 예를 들어 OS 관련 버전은 다음과 같습니다.setlocale()_o_setlocale()

구성 요소의 CRT 상태를 앱의 CRT 상태에서 격리하는 두 가지 방법이 있습니다.

  • 컴파일러 옵션 /MT (릴리스) 또는 /MTd (디버그)를 사용하여 구성 요소를 정적으로 연결합니다. 자세한 내용은 /MD, /MT, /LD를 참조하세요. 정적 연결은 이진 크기를 크게 증가시킬 수 있습니다.
  • Windows 10 버전 2004부터는 CRT에 동적으로 연결하지만 OS 모드 내보내기(o시작하는 함수)를 호출합니다. OS 모드 내보내기를 호출하려면 이전과 같이 정적으로 연결하지만 링커 옵션 /NODEFAULTLIB:libucrt.lib (릴리스) 또는 /NODEFAULTLIB:libucrtd.lib (디버그)를 사용하여 정적 UCRT를 무시합니다. 링커 입력에 추가 ucrt.osmode.lib 합니다. 자세한 내용은 (라이브러리 무시)를 참조하세요 /NODEFAULTLIB .

참고 항목

소스 코드에서 .가 아니라 _o_setlocale()을 씁니다setlocale(). 연결할 ucrt.osmode.lib때 링커는 OS 관련 버전의 함수를 자동으로 대체합니다. 즉, setlocale() .로 _o_setlocale()대체됩니다.

ucrt.osmode.lib 연결하면 앱 모드에서만 사용할 수 있는 일부 UCRT 호출이 비활성화됩니다. 이러한 함수를 호출하려고 하면 링크 오류가 발생합니다.

앱/OS 분리의 영향을 받는 전역 상태

앱 및 OS 상태 분리의 영향을 받는 전역 상태는 다음과 같습니다.

참고 항목

C 런타임 라이브러리 참조