【问题标题】:What does #defining WIN32_LEAN_AND_MEAN exclude exactly?#defining WIN32_LEAN_AND_MEAN 究竟排除了什么?
【发布时间】:2021-09-19 05:13:19
【问题描述】:

我找到了定义WIN32_LEAN_AND_MEAN的解释“通过排除一些不常用的 API 来减小 Win32 头文件的大小”。我在其他地方读到它加快了构建过程。

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

我还在项目中看到了一个预处理器指令,该指令被命名为类似于额外精益的东西。这是我应该知道的另一个深奥的预处理器咒语吗?

【问题讨论】:

    标签: windows visual-c++


    【解决方案1】:

    直接来自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's support page

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

    VC_EXTRALEAN
    WIN32_LEAN_AND_MEAN
    

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

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

    【讨论】:

    • OPENFILENAMEW 的文档说 "commdlg.h (include Windows.h)",但 WIN32_LEAN_AND_MEANcommdlg.h 排除在 Windows.h 之外。这是否意味着我们应该包含commdlg.h,即使文档说“包含Windows.h”?
    • @AyxanHaqverdili 我认为尝试一下不会有什么坏处。如果您遇到任何编译错误,您可以尝试在其前面包含Windows.h,以防commdlg.h 使用Windows.h 中定义的宏。
    【解决方案2】:

    根据Windows Dev Center WIN32_LEAN_AND_MEAN 不包括加密、DDE、RPC、Shell 和 Windows 套接字等 API。

    【讨论】:

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

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

    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 标头中..

    【讨论】:

      猜你喜欢
      • 2020-04-03
      • 2012-07-23
      • 2016-09-10
      • 2023-03-15
      • 2012-10-17
      • 2021-06-04
      • 1970-01-01
      • 2018-07-30
      • 2019-10-06
      相关资源
      最近更新 更多