#defining WIN32_LEAN_AND_MEAN到底排除了什么?


165

我发现定义WIN32_LEAN_AND_MEAN的说明“通过排除一些不常用的API来减小Win32头文件的大小”。我在其他地方读到它可以加快构建过程。

那么WIN32_LEAN_AND_MEAN到底排除了什么?我应该关心这个预处理程序指令吗?它会加快构建过程吗?

我还在项目中看到了一个预处理器指令,该指令的名称类似于“超精益”。这是我应该知道的另一个深奥的预处理器咒语吗?

Answers:


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开发人员中心的说法,WIN32_LEAN_AND_MEAN不包括诸如加密,DDE,RPC,Shell和Windows套接字之类的API。


30
我认为这是我们大多数人所寻求的简洁答案。
Dave Voyles

3
@ DaveVoyles-MSFT,但是它甚至都不会刮擦表面。例如,如果您想使用winsock2.h它,最好确保WIN32_LEAN_AND_MEAN 始终进行定义,因为否则将在WinSock版本之间得到冲突的声明。因此,我更喜欢另一个答案,因为它增加了此处缺少的细节。值得注意的是,它显示了该定义的实际效果。两者都回答了鹦鹉的文档,而另一个都更全面,即使两者都没有提到不使用定义的“影响”(WinSock名称冲突等)。
0xC0000022L
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.