C++ での windows.h の有効性の強化

Syed Hassan Sabeeh Kazmi 2023年10月12日
  1. Windows.h の有効性を高めるために C++ プログラムで NOMINMAX を定義する
  2. WIN32_LEAN_AND_MEAN を使用して C++ で Windows.h の有効性を高める
  3. サブヘッダーを含めて C++ プログラムの Windows.h を置き換え、その効果を高めます
C++ での windows.h の有効性の強化

#include <Windows.h>#include <bits/stdc++.h> ヘッダー ファイルと同じくらい悪い習慣であることが広く認められています。 このチュートリアルでは、Windows.h の有用性の背後にある真実と、それが C++ での悪い習慣なのか良い習慣なのかを学びます。

windows.hは各標準ヘッダーを含む/解析するため(その大部分は不要で非移植性があります)、さらにusing namespace std;と組み合わせると、C++プログラムの名前空間に多数の共通の名前(例:next)が存在し、他の機能を効率的に使用できなくなります。

ただし、bits/stdc++.h および using namespace std; と同じように動作する場合でも、Win32 プログラムの主要な要件です。 組み合わせた。

Windows.h の有効性を高めるために C++ プログラムで NOMINMAX を定義する

windows.h に関連する MSDN ドキュメントでは、特定の機能を実行するために含めるヘッダー ファイルを明示的に定義しています。 windows.h をインクルードするのは、マクロを介してインクルードする前に不要な機能を無効にする場合だけにするのは悪い習慣ではありません。

windows.h を C++ プログラムにインクルードする前に NOMINMAX を定義してください。そうしないと、std::min および std::max と連携する min および max マクロにアクセスできます。 .

windows.h はオペレーティング システム固有のヘッダーで、WSDK (Windows Software Development Kit) に付属しています。

Windows での #include ディレクティブの有用性を高めるために、これを使用することをお勧めします。 ただし、初級レベルまたは中級の C++ 開発者にとっては非常に複雑になる可能性があるため、windows.h を使用する必要があります。

一般に、関数が意図されている状況では windows.h を使用しないでください。C++ で適切にプログラミングするための鍵は、関数の代わりにマクロを使用しないことです。

// operating system (OS) specific
#define NOMINMAX  // minimize the `windows.h` library
#include <Windows.h>

#include <iostream>  // for output

/* an alternative to `#define NOMINMAX`

- you can define min and max macro in the following way

#ifndef NOMINMAX
#define min(x,y) ((x) < (y) ? (x) : (y))
#define max(x,y) ((x) > (y) ? (x) : (y))
#endif

*/

// no use of `using namespace std;` | increase complexity and decrease
// efficiency

int main() { std::cout << "Successful!"; }

出力:

Successful!

Windows 固有のヘッダー ファイルとして、Windows API 関数、一般的なマクロ、およびさまざまな関数とサブシステムのデータ型のすべての宣言を保持し、非常に大きな Windows 固有の関数を C++ プログラムの一部として定義します。

これは、合理的な代替手段がないため、ほぼすべての Windows ベースの C++ プログラムの一部です。 さらにコンパイルして、不要な関数や事前定義された変数を除外することができます。

WIN32_LEAN_AND_MEAN を使用して C++ で Windows.h の有効性を高める

windows.h を呼び出す前に WIN32_LEAN_AND_MEAN を定義すると、あまり役に立たない、または必要でない Windows ヘッダーの一部がバイパスされます。 これは、windows.h の有効性を高めるためのより高速なソリューションの 1つです。

VC_EXTRALEAN または WIN32_LEAN_AND_MEAN を使用して windows.h ヘッダー ファイルのサイズを小さくしますが、これらのプリプロセッサのいずれかを使用すると、ニーズが満たされない場合があり、別のヘッダー ファイルを含める必要があります。

MSDN 検索を使用して、使用する関数に名前を付けて、それがどのヘッダー ファイルに属しているかがわかるようにします。

DDE、Windows Sockets、RPC、Shell、Cryptography など、あまり役に立たない API や特定目的の API は除外されます。

さらに、OPENFILENAMEW のドキュメントには、commdlg.hwindows.h の一部であると記載されていますが、WIN32_LEAN_AND_MEANwindows.h から除外されています。 commdlg.hwindows.h で定義されたマクロを使用します。

#define WIN32_LEAN_AND_MEAN
#define VC_EXTRALEAN  // an alternative or addition
#include <Windows.h>

#include <iostream>  // output

int main() {
  int a = 5;
  int b = 7;
  int sol;

  sol = a * (b / a);

  std::cout << sol;
}

出力:

5

使用頻度の低い Windows API の一部が除外されるため、ビルド プロセスが高速化され、Win32 ヘッダー ファイルのサイズが縮小されます。

windows.h には、それと他の多くのサブヘッダーが含まれています。 したがって、具体的に定義すると、C++ プロセスのリソースを最大化できます。

サブヘッダーを含めて C++ プログラムの Windows.h を置き換え、その効果を高めます

windows.h のサブヘッダーは、かなり安定した構造になっているようです。 windows.h 全体を使用してその 1つまたは 2つの機能のみを使用する代わりに、多くの小さなヘッダーの 1つを含めてニーズを定義することができます。

windef.h には、windows.h の基本関数の多くが含まれており、7,000 行を超える実際のコードに基づいています。 fileapi.h は、CreateFileFindFirstFile、およびその他の同様の関数を定義します。

#include <fileapi.h>
#include <windef.h>

#include <iostream>

int main() {
  typedef struct tagPOINT {
    LONG x;
    LONG y;
  }

  POINT,
      *PPOINT, *NPPOINT, *LPPOINT;

  std::cout << "The operation is successful!";
}

出力:

The operation is successful!

さらに、同期プリミティブに synchapi.h を使用できます (WaitForMultipleObjectsInitializeCriticalSection、または windows.h の他の同期関数部分)。

debugapi.h サブヘッダー ファイルは、OutputDebugStringIsDebuggerPresent、およびその他のデバッグ関数用です。

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub

関連記事 - C++ Header