Bagikan melalui


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 tambahkan ucrt.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:

Lihat juga

Referensi pustaka Run-Time C