#defining WIN32_LEAN_AND_MEAN完全排除了什么?

fis*_*ood 148 windows visual-c++

我发现定义WIN32_LEAN_AND_MEAN的解释"通过排除一些不太常用的API来减小Win32头文件的大小".在其他地方,我读到它可以加快构建过程.

那么WIN32_LEAN_AND_MEAN究竟排除了什么?我应该关心这个预处理器指令吗?它是否加快了构建过程?

我还在项目中看到了一个预处理器指令,其名称与额外精益有关.这是我应该知道的另一个深奥的预处理器咒语吗?

bit*_*ise 140

直接来自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 */
Run Code Online (Sandbox Code Playgroud)

如果你想知道每个标题实际上做了什么,在MSDN库中的搜索中键入标题名称通常会产生该标题文件中的函数列表.

此外,从Microsoft的支持页面:

为了加快构建过程,Visual C++和Windows标头提供了以下新定义:

VC_EXTRALEAN
WIN32_LEAN_AND_MEAN

您可以使用它们来减小Win32头文件的大小.

最后,如果您选择使用这些预处理器中的任何一个,并且缺少所需的内容,则可以自己包含该特定的头文件.在MSDN中键入您之后的函数名称通常会生成一个条目,该条目将告诉您在页面底部要使用哪个标题.


Chr*_*911 108

根据Windows开发人员中心, WIN32_LEAN_AND_MEAN排除了诸如加密,DDE,RPC,Shell和Windows套接字之类的API.

  • 我认为这是我们大多数人都在寻找的简洁答案. (17认同)
  • @DaveVoyles-MSFT,但它甚至没有触及表面。例如,如果您想使用“winsock2.h”,您最好确保“WIN32_LEAN_AND_MEAN”始终被定义,否则您将在 WinSock 版本之间得到冲突的声明。所以我更喜欢另一个答案,因为它添加了此处缺少的细节。值得注意的是,它显示了该定义的实际效果。两者都回答了鹦鹉文档,而另一个则更全面,尽管两者都没有提及不使用定义的“后果”(WinSock 名称冲突等)。 (7认同)

小智 10

补充上述答案以及Windows 开发中心文档中的“鹦鹉学舌”,

Winsock2.h 头文件内部包含 Windows.h 头文件中的核心元素,因此 Winsock 应用程序中的 Windows.h 头文件通常没有 #include 行。如果 Windows.h 头文件需要 #include 行,则应在其前面添加 #define WIN32_LEAN_AND_MEAN 宏。由于历史原因,Windows.h 标头默认包含 Windows Sockets 1.1 的 Winsock.h 标头文件。Winsock.h 头文件中的声明将与 Windows Sockets 2.0 所需的 Winsock2.h 头文件中的声明发生冲突。WIN32_LEAN_AND_MEAN 宏可防止 Winsock.h 包含在 Windows.h 标头中。


小智 9

Raymond Chen 的博客对此动机给出了一个很好的答案:\n https://devblogs.microsoft.com/oldnewthing/20091130-00/?p=15863

\n
\n

...定义 WIN32_LEAN_AND_MEAN 让您回到 16 位 Windows 哲学,即用于编写基本 Windows 程序的最小头文件集。这安抚了那些喜欢对头文件进行微观管理的程序员,这是一个很大的帮助,因为在引入该符号时,预编译头文件并不常用。我记得,在具有 8MB 内存的 50MHz 80486 上,切换到 WIN32_LEAN_AND_MEAN 可以将每个 C 文件的编译时间缩短三秒。当您的项目由 20 个 C 文件组成时,\xe2\x80\x99 就在那里节省了整整一分钟。

\n
\n