Що саме виключає #defining WIN32_LEAN_AND_MEAN?


165

Я знайшов пояснення, що визначає, що WIN32_LEAN_AND_MEAN "зменшує розмір файлів заголовків Win32, виключаючи деякі менш часто використовувані API". Десь я прочитав, що це прискорює процес збирання.

То що саме WIN32_LEAN_AND_MEAN виключає? Чи повинен мені хвилюватися ця директива перед процесором? Це прискорює процес збирання?

Я також бачив директиву препроцесора в проектах, названих чимось узгодженим. Це ще одна езотерична заклинання препроцесора, про яку я повинен знати?

Відповіді:


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, зазвичай створює запис, який підкаже вам, який заголовок включити, якщо ви хочете його використовувати, внизу сторінки.


140

Відповідно до Windows Dev Center WIN32_LEAN_AND_MEAN виключає такі API, як Cryptography, DDE, RPC, Shell та Windows Sockets.


30
Я думаю, що це лаконічна відповідь, яку більшість з нас шукали.
Дейв Войлес

3
@ DaveVoyles-MSFT, але він навіть не дряпає поверхню. Наприклад, якщо ви хочете використовувати winsock2.h, краще переконайтеся, що WIN32_LEAN_AND_MEAN це завжди визначено, оскільки в іншому випадку ви отримаєте суперечливі декларації між версіями WinSock. Тому мені подобається інша відповідь, тому що вона додає тут деталей, відсутніх. Примітно, це показує, що є фактичним ефектом цього визначення. Обидва відповідають документації на папугу, а інша - більш всеохоплююча, хоча обидві не зазначають "наслідки" не використання визначення (зіткнення імені WinSock тощо).
0xC0000022L
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.