CRT'deki genel durum
Evrensel C Çalışma Zamanı'ndaki (UCRT) bazı işlevler genel durumu kullanır. Örneğin, setlocale()
basamak ayırıcılarını, metin kodu sayfasını vb. etkileyen tüm programın yerel ayarını ayarlar.
UCRT'nin genel durumu uygulamalar ve işletim sistemi arasında paylaşılamaz. Örneğin, uygulamanız öğesini çağırırsa setlocale()
, C çalışma zamanını kullanan işletim sistemi bileşenlerinin yerel ayarını etkilemez veya tam tersi olur.
CRT işlevlerinin işletim sistemine özgü sürümleri
UCRT'de, genel durumla etkileşim kuran işlevlerin ön eki ile _o_
önekli bir "ikiz" işlevi vardır. Örneğin:
setlocale()
uygulamaya özgü genel durumu etkiler._o_setlocale()
tüm işletim sistemi bileşenleri tarafından paylaşılan genel durumu etkiler, ancak uygulamalar tarafından paylaşılmaz.
Bu "ikiz" işlevler arasındaki tek fark, genel CRT durumunu okuduklarında/yazdıklarında, işletim sistemine özgü sürümlerin (yani ile _o_
başlayan sürümler) uygulamanın genel durum kopyası yerine genel durumun işletim sistemi kopyasını kullanmasıdır.
Bu işlevlerin işletim sistemine özgü sürümleri içindedir ucrt.osmode.lib
. Örneğin işletim sistemine özgü sürümü setlocale()
_o_setlocale()
Bileşeninizin CRT durumunu bir uygulamanın CRT durumundan yalıtmanın iki yolu vardır:
- Derleyici seçeneklerini
/MT
(yayın) veya/MTd
(hata ayıklama) kullanarak bileşeninizi statik olarak bağlayın. Ayrıntılar için bkz. /MD, /MT, /LD. Statik bağlama, ikili boyutu büyük ölçüde artırabilir. - Windows 10 sürüm 2004 ile başlayan Windows sürümlerinden başlayarak, CRT'ye dinamik olarak bağlanın, ancak işletim sistemi modu dışarı aktarmalarını (o ile başlayan işlevler) çağırın. İşletim sistemi modu dışarı aktarmalarını çağırmak için, daha önce olduğu gibi statik olarak bağlayın, ancak bağlayıcı seçeneğini
/NODEFAULTLIB:libucrt.lib
(yayın) veya/NODEFAULTLIB:libucrtd.lib
(hata ayıklama) kullanarak statik UCRT'yi yoksayın. Ve bağlayıcı girişine ekleyinucrt.osmode.lib
. Ayrıntılar için bkz/NODEFAULTLIB
. (Kitaplıkları Yoksay).
Not
Kaynak kodunda yazın, setlocale()
yazın._o_setlocale()
ile ucrt.osmode.lib
bağlantı oluşturduğunuzda bağlayıcı otomatik olarak işlevin işletim sistemine özgü sürümünün yerini alır. Yani, setlocale()
ile _o_setlocale()
değiştirilecektir.
ile bağlantı, ucrt.osmode.lib
yalnızca uygulama modunda kullanılabilen bazı UCRT çağrılarını devre dışı bırakır. Bu işlevleri çağırmaya çalışmak bağlantı hatasına neden olur.
Uygulama/işletim sistemi ayrımlarından etkilenen genel durum
Uygulama ve işletim sistemi durumunun ayrılmasının etkilediği genel durum şunları içerir:
- Yerel ayar verileri
- Tarafından ayarlanan sinyal işleyicileri
signal
- Tarafından ayarlanan sonlandırma yordamları
terminate
errno
ve_doserrno
- ve tarafından
rand
kullanılan rastgele sayı oluşturma durumusrand
- Kullanıcının serbest bırakması gerekmeyen bir arabellek döndüren işlevler:
strtok
,wcstok
,_mbstok
Tmpnam
,_wtmpnam
asctime
,_wasctime
gmtime
,_gmtime32
,_gmtime64
_fcvt
_ecvt
strerror
,_strerror
,_wcserror
,__wcserror
- tarafından
_putch
kullanılan arabellek._putwch
_set_invalid_parameter_handler
,_set_thread_local_invalid_parameter_handler
_set_new_handler
ve_set_new_mode
fmode
- Saat dilimi bilgileri