Co dokładnie wyklucza #defining WIN32_LEAN_AND_MEAN?


165

Znalazłem wyjaśnienie definiujące WIN32_LEAN_AND_MEAN "zmniejsza rozmiar plików nagłówkowych Win32 poprzez wykluczenie niektórych rzadziej używanych API". Gdzie indziej czytałem, że przyspiesza to proces budowania.

Więc co dokładnie wyklucza WIN32_LEAN_AND_MEAN? Czy powinno mnie obchodzić ta dyrektywa dotycząca preprocesorów? Czy przyspiesza proces kompilacji?

Widziałem również dyrektywę preprocesora w projektach o nazwie coś podobnego do extra Lean. Czy to kolejna ezoteryczna inkantacja preprocesora, o której powinienem wiedzieć?

Odpowiedzi:


158

Bezpośrednio z pliku nagłówkowego Windows.h:

#ifndef WIN32_LEAN_AND_MEAN
    #include <cderr.h>
    #include <dde.h>
    #include <ddeml.h>
    #include <dlgs.h>
    #ifndef _MAC
        #include <lzexpand.h>
        #include <mmsystem.h>
        #include <nb30.h>
        #include <rpc.h>
    #endif
    #include <shellapi.h>
    #ifndef _MAC
        #include <winperf.h>
        #include <winsock.h>
    #endif
    #ifndef NOCRYPT
        #include <wincrypt.h>
        #include <winefs.h>
        #include <winscard.h>
    #endif

    #ifndef NOGDI
        #ifndef _MAC
            #include <winspool.h>
            #ifdef INC_OLE1
                #include <ole.h>
            #else
                #include <ole2.h>
            #endif /* !INC_OLE1 */
        #endif /* !MAC */
        #include <commdlg.h>
    #endif /* !NOGDI */
#endif /* WIN32_LEAN_AND_MEAN */

jeśli chcesz wiedzieć, co faktycznie robi każdy z nagłówków, wpisanie nazw nagłówków do wyszukiwania w bibliotece MSDN zwykle tworzy listę funkcji w tym pliku nagłówkowym.

Ponadto ze strony pomocy technicznej firmy Microsoft :

Aby przyspieszyć proces kompilacji, Visual C ++ i nagłówki Windows udostępniają następujące nowe definicje:

VC_EXTRALEAN
WIN32_LEAN_AND_MEAN

Możesz ich użyć do zmniejszenia rozmiaru plików nagłówkowych Win32.

Wreszcie, jeśli zdecydujesz się użyć któregokolwiek z tych definicji preprocesora, a brakuje czegoś, czego potrzebujesz, możesz po prostu samodzielnie dołączyć ten konkretny plik nagłówkowy. Wpisanie nazwy funkcji, której szukasz, w MSDN zwykle spowoduje wyświetlenie u dołu strony wpisu, który powie Ci, który nagłówek należy uwzględnić, jeśli chcesz go użyć.


140

Według Centrum deweloperów systemu Windows WIN32_LEAN_AND_MEAN wyklucza interfejsy API, takie jak Cryptography, DDE, RPC, Shell i Windows Sockets.


30
Myślę, że jest to zwięzła odpowiedź, której szukała większość z nas.
Dave Voyles

3
@ DaveVoyles-MSFT, a mimo to nawet nie rysuje powierzchni. Na przykład, jeśli chcesz z siebie korzystać winsock2.h, lepiej upewnij się, że WIN32_LEAN_AND_MEAN zawsze jest zdefiniowane, ponieważ w przeciwnym razie wystąpią sprzeczne deklaracje między wersjami WinSock. Więc bardziej podoba mi się druga odpowiedź, ponieważ dodaje brakujące tutaj szczegóły. W szczególności pokazuje, jaki jest rzeczywisty efekt tego zdefiniowania. Obie odpowiedzi na dokumentację papugi, a jednak druga jest bardziej obszerna, chociaż obie nie wspominają o "konsekwencjach" nieużywania definicji (konflikty nazw WinSock itp.).
0xC0000022L
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.