Что точно исключает #defining WIN32_LEAN_AND_MEAN?

165

Я нашел объяснение, определяющее, что WIN32_LEAN_AND_MEAN «уменьшает размер заголовочных файлов Win32, исключая некоторые из менее часто используемых API». Где-то еще я читал, что это ускоряет процесс сборки.

Итак, что именно исключает WIN32_LEAN_AND_MEAN? Должен ли я заботиться об этой директиве препроцессора? Ускоряет ли это процесс сборки?

Я также видел директиву препроцессора в проектах, названных по принципу extra lean. Это еще одно эзотерическое заклинание препроцессора, о котором я должен знать?

корм для рыб
источник

Ответы:

158

Непосредственно из заголовочного файла 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 */

если вы хотите знать, что на самом деле делает каждый из заголовков, то при вводе имен заголовков в поиск в библиотеке MSDN обычно получается список функций в этом заголовочном файле.

Также со страницы поддержки Microsoft :

Для ускорения процесса сборки Visual C ++ и заголовки Windows предоставляют следующие новые определения:

VC_EXTRALEAN
WIN32_LEAN_AND_MEAN

Вы можете использовать их, чтобы уменьшить размер заголовочных файлов Win32.

Наконец, если вы решите использовать любой из этих определений препроцессора, а то, что вам нужно, отсутствует, вы можете просто включить этот конкретный заголовочный файл самостоятельно. Ввод имени функции, которую вы ищете в MSDN, обычно приводит к появлению записи, которая скажет вам, какой заголовок включить, если вы хотите его использовать, внизу страницы.

CuriousGeorge
источник
140

Согласно Windows Dev Center WIN32_LEAN_AND_MEAN исключает такие API-интерфейсы, как криптография, DDE, RPC, Shell и Windows Sockets.

Chris911
источник
30
Я думаю, что это краткий ответ, который большинство из нас искали.
Дейв Войлес
3
@ DaveVoyles-MSFT, и все же он даже не царапает поверхность. Например, если вы хотите использовать winsock2.hего, лучше убедиться, что WIN32_LEAN_AND_MEAN он всегда определен, потому что в противном случае вы получите конфликтующие объявления между версиями WinSock. Поэтому мне больше нравится другой ответ, потому что он добавляет недостающие детали. Примечательно, что это показывает, каков фактический эффект этого определения. Оба отвечают на документацию попугая, и все же другой является более всесторонним, даже при том, что оба не упоминают "последствия" не использования определения (конфликт имен WinSock и т. Д.).
0xC0000022L