Status global dalam CRT
Beberapa fungsi dalam Universal C Runtime (UCRT) menggunakan status global. Misalnya, setlocale()
mengatur lokal untuk seluruh program, yang memengaruhi pemisah digit, halaman kode teks, dan sebagainya.
Status global UCRT tidak dibagikan antara aplikasi dan OS. Misalnya, jika aplikasi Anda memanggil setlocale()
, itu tidak akan memengaruhi lokal untuk komponen OS apa pun yang menggunakan run-time C, atau sebaliknya.
Versi fungsi CRT khusus OS
Dalam UCRT, fungsi yang berinteraksi dengan status global memiliki fungsi "kembar", diawali dengan _o_
. Contohnya:
setlocale()
mempengaruhi status global khusus untuk aplikasi._o_setlocale()
memengaruhi status global yang dibagikan oleh semua komponen OS, tetapi bukan aplikasi.
Satu-satunya perbedaan antara fungsi "kembar" ini adalah bahwa ketika mereka membaca/menulis status CRT global, versi khusus OS (yaitu, versi yang dimulai dengan _o_
) menggunakan salinan OS status global alih-alih salinan status global aplikasi.
Versi khusus OS dari fungsi-fungsi ini ada di ucrt.osmode.lib
. Misalnya, versi khusus OS adalah setlocale()
_o_setlocale()
Ada dua cara untuk mengisolasi status CRT komponen Anda dari status CRT aplikasi:
- Tautkan komponen Anda secara statis dengan menggunakan opsi
/MT
pengkompilasi (rilis) atau/MTd
(debug). Untuk detailnya, lihat /MD, /MT, /LD. Penautan statis dapat sangat meningkatkan ukuran biner. - Dimulai pada versi Windows yang dimulai dengan Windows 10 versi 2004, secara dinamis ditautkan ke CRT tetapi memanggil ekspor mode OS (fungsi yang dimulai dengan o). Untuk memanggil ekspor mode OS, tautkan secara statis seperti sebelumnya, tetapi abaikan UCRT statis dengan menggunakan opsi
/NODEFAULTLIB:libucrt.lib
linker (rilis) atau/NODEFAULTLIB:libucrtd.lib
(debug). Dan tambahkanucrt.osmode.lib
ke input linker. Lihat/NODEFAULTLIB
(Abaikan Pustaka) untuk detailnya.
Catatan
Dalam kode sumber, tulis setlocale()
, bukan _o_setlocale()
. Ketika Anda menautkan terhadap ucrt.osmode.lib
, linker akan secara otomatis menggantikan versi fungsi khusus OS. Artinya, setlocale()
akan diganti dengan _o_setlocale()
.
Penautan terhadap ucrt.osmode.lib
menonaktifkan beberapa panggilan UCRT yang hanya tersedia dalam mode aplikasi. Mencoba memanggil fungsi-fungsi ini akan mengakibatkan kesalahan tautan.
Status global yang dipengaruhi oleh pemisahan aplikasi/OS
Status global yang dipengaruhi oleh pemisahan aplikasi dan status OS meliputi:
- Data lokal
- Penangan sinyal diatur oleh
signal
- Rutinitas penghentian yang ditetapkan oleh
terminate
errno
dan_doserrno
- Status pembuatan angka acak yang digunakan oleh
rand
dansrand
- Fungsi yang mengembalikan buffer yang tidak perlu dirilis pengguna:
strtok
, ,wcstok
_mbstok
Tmpnam
,_wtmpnam
asctime
,_wasctime
gmtime
, ,_gmtime32
_gmtime64
_fcvt
_ecvt
strerror
, ,_strerror
_wcserror
,__wcserror
- Buffer yang digunakan oleh
_putch
,_putwch
_set_invalid_parameter_handler
,_set_thread_local_invalid_parameter_handler
_set_new_handler
dan_set_new_mode
fmode
- Informasi zona waktu