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 상태 분리의 영향을 받는 전역 상태는 다음과 같습니다.
- 로캘 데이터
- 다음으로 설정된 신호 처리기
signal
- 다음으로 설정된 종료 루틴
terminate
errno
및_doserrno
- 다음에서 사용하는
rand
난수 생성 상태srand
- 사용자가 해제할 필요가 없는 버퍼를 반환하는 함수:
strtok
wcstok
_mbstok
Tmpnam
,_wtmpnam
asctime
,_wasctime
gmtime
, ,_gmtime32
_gmtime64
_fcvt
_ecvt
strerror
,_strerror
,_wcserror
__wcserror
- 에서 사용하는
_putch
버퍼입니다._putwch
_set_invalid_parameter_handler
,_set_thread_local_invalid_parameter_handler
_set_new_handler
및_set_new_mode
fmode
- 표준 시간대 정보