Verbessern Sie die Effektivität von windows.h in C++

Syed Hassan Sabeeh Kazmi 12 Oktober 2023
  1. Definieren Sie NOMINMAX in einem C++-Programm, um die Effektivität von Windows.h zu verbessern
  2. Verwenden Sie WIN32_LEAN_AND_MEAN, um die Effektivität von Windows.h in C++ zu verbessern
  3. Fügen Sie Sub-Header ein, um Windows.h in einem C++-Programm zu ersetzen, um dessen Effektivität zu verbessern
Verbessern Sie die Effektivität von windows.h in C++

Es ist allgemein anerkannt, dass #include <Windows.h> genauso schlecht ist wie die Header-Datei #include <bits/stdc++.h>. In diesem Tutorial erfahren Sie die Wahrheit hinter der Nützlichkeit von Windows.h und ob es eine schlechte oder gute Praxis in C++ ist.

Da windows.h jeden Standard-Header enthält/parst (die meisten von ihnen sind unnötig und nicht portierbar) und sogar noch mehr, wenn es mit using namespace std; kombiniert wird, enthält es eine große Anzahl allgemeiner Namen im Namensraum Ihres C++-Programms wie next, wodurch Sie die anderen Funktionen nicht ineffizient nutzen konnten.

Es ist jedoch eine Hauptvoraussetzung für die Win32-Programme, auch wenn es die gleiche Leistung erbringt wie bits/stdc++.h und using namespace std; kombiniert.

Definieren Sie NOMINMAX in einem C++-Programm, um die Effektivität von Windows.h zu verbessern

Die MSDN-Dokumentation zu windows.h definiert explizit, welche Header-Dateien einzuschließen sind, um eine bestimmte Funktion auszuführen. Es ist keine schlechte Praxis, windows.h nur einzufügen, wenn Sie seine unnötigen Funktionen deaktivieren, bevor Sie es über das Makro einbinden.

Definieren Sie NOMINMAX, bevor Sie windows.h in Ihr C++-Programm einbinden, da Sie sonst Zugriff auf ein min- und ein max-Makro erhalten, das mit std::min und std::max kommuniziert. .

Die windows.h ist ein betriebssystemspezifischer Header und wird mit dem WSDK (Windows Software Development Kit) geliefert.

Seine Verwendung wird empfohlen, um die Nützlichkeit Ihrer #include-Direktiven unter Windows zu erhöhen; Für C++-Entwickler auf Einstiegs- oder fortgeschrittenem Niveau kann es sich jedoch als äußerst komplex erweisen, daher sollten sie die Datei windows.h verwenden.

Verwenden Sie im Allgemeinen windows.h nicht in Situationen, in denen eine Funktion beabsichtigt ist, da der Schlüssel zu guter Programmierung in C++ darin besteht, niemals Makros anstelle einer Funktion zu verwenden.

// 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!"; }

Ausgang:

Successful!

Als Windows-spezifische Headerdatei enthält sie alle Deklarationen für Windows-API-Funktionen, allgemeine Makros und Datentypen für verschiedene Funktionen und Subsysteme und definiert extrem große Windows-spezifische Funktionen als Teil Ihres C++-Programms.

Es ist ein Teil fast jedes Windows-basierten C++-Programms, da es keine vernünftige Alternative gibt. Sie können es weiter kompilieren, um einige unnötige Funktionen und vordefinierte Variablen auszuschließen.

Verwenden Sie WIN32_LEAN_AND_MEAN, um die Effektivität von Windows.h in C++ zu verbessern

Wenn WIN32_LEAN_AND_MEAN vor dem Aufruf von windows.h definiert wird, werden einige der weniger nützlichen oder erforderlichen Windows-Header umgangen. Es ist eine der schnelleren Lösungen, um die Effektivität von windows.h zu erhöhen.

Verwenden Sie VC_EXTRALEAN oder WIN32_LEAN_AND_MEAN, um die Größe der Header-Datei windows.h zu reduzieren, aber wenn Sie einen dieser Präprozessoren verwenden, werden Sie manchmal Ihre Anforderungen nicht erfüllen, und Sie müssen eine andere Header-Datei hinzufügen.

Verwenden Sie die MSDN-Suche, um eine Funktion zu benennen, die Sie verwenden möchten, damit sie Ihnen mitteilen kann, zu welcher Headerdatei sie gehört.

Es schließt weniger nützliche oder zweckgebundene APIs wie DDE, Windows Sockets, RPC, Shell und Kryptografie aus.

Außerdem sagt die Dokumentation für OPENFILENAMEW, dass die commdlg.h ein Teil von windows.h ist, aber WIN32_LEAN_AND_MEAN sie von windows.h ausschliesst, und Sie sie separat einbinden können, weil die commdlg.h verwendet in windows.h definierte Makros.

#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;
}

Ausgang:

5

Da es einige der weniger häufig verwendeten Windows-APIs ausschließt, beschleunigt es den Build-Prozess und reduziert die Größe von Win32-Header-Dateien.

Die windows.h enthält es und viele andere Unterüberschriften; Daher kann die spezifische Definition eines solchen die Ressourcen Ihrer C++-Prozesse maximieren.

Fügen Sie Sub-Header ein, um Windows.h in einem C++-Programm zu ersetzen, um dessen Effektivität zu verbessern

Die Sub-Header von windows.h scheinen ziemlich stabil aufgebaut zu sein. Sie können einen der vielen kleineren Header einfügen, um Ihre Bedürfnisse zu definieren, anstatt windows.h als Ganzes zu verwenden und nur seine ein oder zwei Funktionen zu verwenden.

Die windef.h enthält viele der Basisfunktionen von windows.h und basiert auf mehr als siebentausend Zeilen tatsächlichen Codes. Die fileapi.h definiert CreateFile, FindFirstFile und andere ähnliche Funktionen.

#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!";
}

Ausgang:

The operation is successful!

Zusätzlich können Sie synchapi.h für Synchronisierungsprimitive verwenden (WaitForMultipleObjects, InitializeCriticalSection oder andere Synchronisierungsfunktionen, die Teil von windows.h sind).

Die Sub-Header-Datei debugapi.h ist für OutputDebugString, IsDebuggerPresent und andere Debugging-Funktionen.

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

Verwandter Artikel - C++ Header