2016-04-10 11 views
0

algorithm, memory, string gibi C++ standart kitaplıklarının bazı işlemleri gerçekleştirmek için Windows API üstbilgisini kullandığını belirleyen biriyle tartışıyorum.C++ standart kütüphanesi herhangi bir noktada platform başına yerel başlıkları içeriyor mu?

Durum böyle mi, değil mi? Tüm Windows PE'lerinin WinAPI'den yerel DLL'leri içerdiğini biliyorum, ancak standart kitaplığın tüm derleyici/os bağımlı olduğundan emin değilim.

+1

Standart kitaplığın derleyici/OS bağımlı olmasına izin verilir. Örneğin, genellikle derleyiciye özgü uzantılardan yararlanacaklardır. –

+0

@RaymondChen Standart kütüphanenin Windows API'yi kullanmasına neden gerek duyduğunu düşünemiyorum. Başlık altında, kesinlikle Windows için uygulama, WinAPI kullandığı alanları için sadece C kullanabilir. Standart kütüphanede WinAPI veya hatta * nix libs için herhangi bir kullanım durumu düşünemiyorum. – oldjohn1994

+1

@ Structure: Windows'ta C++ istisnaları, SEH istisnalarının üzerine modellenmiştir. Bunlar derleyici uzantıları ve CRT'nin bir karışımı kullanılarak uygulanır. Bu, ** nedenlerinden biri olan ** bir ** 'dir, neden C++ Standard Library'nin (veya CRT'nin) OS'ye özgü uygulamaları kullanması gerektiği. Tam olarak anlaşılmamış gibi görünüyorsunuz, CRT'nin Windows API'sının üstünde uygulanması. Başka yoldan değil. – IInspectable

cevap

2

C++ standart kitaplığı, bir C++ programına eklendiğinde, standart tarafından tanımlanan efektlere sahip olan bir #include <> yönergeleri kümesidir. Teknik olarak, hiç bir dosyaya ihtiyaç duymazlar - standardın gerektirdiği tüm #include <blah> yönergeleri, direktifin ardından programların davranışlarını değiştiren derleyici içselleri olabilir. Pratikte, genellikle saf C++ üstbilgisi dosya kodunun bir karışımı, derleyici intrinsiklerini veya platforma özgü ayrıntıları kullanan başlık dosya kodu ve kütüphanelerin OS'ye özgü, donanım-bir karışımında uygulandığı kütüphanelerdir. Spesifik veya C/C++.

C++ uygulamasında uygulanamayan C++ standart kitaplığının bölümleri vardır.

+0

Ancak standart kitaplıktaki herhangi bir üstbilgi dosyası hiç bir zaman açıkça #mu? Standart kütüphanenin sisteme özel API'ler içermediğinden bellek hatıraları için (ama yine de neden rahatsızlık yarattığını, standartın sadece C'yi kullanabildiğini) hayal edebiliyorum. – oldjohn1994

+0

@struction: CRT sihirli bir mermi değildir. işletim sisteminden farklı olarak. Bir noktada CRT, OS'ye özgü işlevleri (bellek yönetimi, dosya erişimi, istisna işleme, vb.) Kullanmalıdır. Özel uygulamanızdan herhangi bir C++ kütüphanesi 'dosyası' içeriyor olsun ya da olmasın * Windows.h * hiç de ilginç değildir. CRT ve (/ veya) C++ Standart Kitaplığı bir noktada derleyici/OS özeldir. – IInspectable

+0

@IInspectable: 'windows.h', kullanıcının koduyla çatışabilecek bir sürü şeyi tanımlar, bu yüzden pek ilgisizdir. Açıkçası, standardın bunu açık nedenlerle yasaklamasını beklerdim. (Açıkçası, kütüphanenin kaynak kodunun 'windows.h' kullanması gerekir, ancak bu, standart dosyalardan biri ile aynı değildir.) –

1

Kısa cevap: evet, standart kitaplık, belirli bir platformdan yararlanabilir (ve yapar).

Uzun yanıt: Kullanıcıya açık olan arabirim, platformlar arasında aynıdır, ancak uygulama, platform + derleyicisine özgü özelliklerden yararlanabilir.

Kanıt ister misiniz?

: C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \

Git dahil örneğin, en son görsel stüdyo (varsayılan olarak) burada, derleyici için dahil dizini bulun komut satırı ve bu dizin çalıştırın: benim makinede

findstr -s -n -i -l "<windows.h>" *

, bu çıkışlar:

delayhlp.cpp:25:#include <windows.h> 
msclr\marshal.h:20:#include <windows.h> 
msclr\marshal_windows.h:18:#include <windows.h> 
vccorlib.h:34:#include <windows.h> 
vsgcapture.h:4:#include <Windows.h> 

Evet, windows.h çoklu uygulama dosyaları tarafından dahil edildi.yorumlara yanıt olarak


Düzenleme:

görsel stüdyoda dosyası "iplik" incelenmesi dizin std :: iplik uygulanmasını ortaya şunlardır :: katılmak geçerli:

inline void thread::join() 
    { // join thread 
    if (!joinable()) 
     _Throw_Cpp_error(_INVALID_ARGUMENT); 
    if (_Thr_is_null(_Thr)) 
     _Throw_Cpp_error(_INVALID_ARGUMENT); 
    if (get_id() == _STD this_thread::get_id()) 
     _Throw_Cpp_error(_RESOURCE_DEADLOCK_WOULD_OCCUR); 
    if (_Thrd_join(_Thr, 0) != _Thrd_success) 
     _Throw_Cpp_error(_NO_SUCH_PROCESS); 
    _Thr_set_null(_Thr); 
} 

Çeşitli _Thrd_XXX işlevleri, C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\crt\src\stl

adresinde cthread.c işlevlerinde tanımlanmıştır. Örneğin 210

, _Thrd_join geçerli: WaitForSingleObjectEx

gibi çeşitli pencereler API işlevlerini kullanır

int _Thrd_join(_Thrd_t thr, int *code) 
    { /* return exit code when thread terminates */ 
    unsigned long res; 
    if (WaitForSingleObjectEx(thr._Hnd, INFINITE, FALSE) == WAIT_FAILED 
     || GetExitCodeThread(thr._Hnd, &res) == 0) 
     return (_Thrd_error); 
    if (code) 
     *code = (int)res; 
    return (CloseHandle(thr._Hnd) == 0 ? _Thrd_error : _Thrd_success); 
} 

Yani öyle görünüyor ki "windows.h" standart kitaplığındaki başlıkların kullanıcılara görünmez olmasına rağmen, bu Bu fonksiyonların uygulanmasında kullanılır.

Uygulama dosyalarının (cthread.c gibi), aynı dizindeki "wrapwin.h" isimli bir dosya aracılığıyla "windows.h" içerdiğini ve dosyadaki yorumlara göre derleyici uyarılarının bastırıldığını unutmayın. "windows.h"

+2

Bu sadece Visual Studio derleyici gibi Windows derleyici ile ilgili şeyler değil mi? Bu dosyalar, C++ STL – oldjohn1994

+2

yerine CLR'nin bir parçası gibi görünmektedir. Bu uygulama dosyalarının hiçbiri, söyleyebildiğim kadarıyla herhangi bir standart üstbilgiye dahil değildir :) – melak47

+0

Ve ucrt da Windows.h veya Winuser'dan temiz görünüyor. h içerir. – melak47

İlgili konular