#defining WIN32_LEAN_AND_MEANは正確に何を除外しますか?


165

WIN32_LEAN_AND_MEANを定義する説明は、「あまり使用されないAPIの一部を除外することにより、Win32ヘッダーファイルのサイズを削減する」とわかりました。他のどこかで、ビルドプロセスが高速化されると読みました。

では、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は、暗号化、DDE、RPC、シェル、WindowsソケットなどのAPIを除外します。


30
これは私たちのほとんどが探していた簡潔な答えだと思います。
Dave Voyles 2017

3
@ DaveVoyles-MSFTでありながら、表面を傷つけることすらありません。たとえば、WinSockのバージョン間で宣言が競合するため、使用するwinsock2.h場合WIN32_LEAN_AND_MEAN は常にが定義されていることを確認してください。ここに欠けている詳細が追加されるので、私は他の答えの方が好きです。特に、その定義の実際の効果は何かを示しています。どちらもオウムのドキュメントに答えますが、もう1つはより包括的なものですが、どちらも定義を使用しないことの「影響」(WinSockの名前の衝突など)について言及していません。
0xC0000022L
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.