Mejorar la efectividad de windows.h en C++

Syed Hassan Sabeeh Kazmi 12 octubre 2023
  1. Defina NOMINMAX en un programa C++ para mejorar la eficacia de Windows.h
  2. Utilice WIN32_LEAN_AND_MEAN para mejorar la eficacia de Windows.h en C++
  3. Incluya subtítulos para reemplazar Windows.h en un programa C++ para mejorar su eficacia
Mejorar la efectividad de windows.h en C++

Se acepta universalmente que #include <Windows.h> es una mala práctica como el archivo de encabezado #include <bits/stdc++.h>. En este tutorial, aprenderá la verdad detrás de la utilidad de Windows.h y si es una mala o buena práctica en C++.

Debido a que windows.h incluye/analiza cada encabezado estándar (la mayoría de ellos son innecesarios y no portátiles) y aún más cuando se combina con usar el espacio de nombres estándar, presenta una gran cantidad de nombres comunes en el espacio de nombres de su programa C++ como siguiente que le impidió utilizar las otras funciones de manera ineficiente.

Sin embargo, es un requisito principal para los programas Win32 incluso si funciona igual que bits/stdc++.h y using namespace std; conjunto.

Defina NOMINMAX en un programa C++ para mejorar la eficacia de Windows.h

La documentación de MSDN relacionada con windows.h define explícitamente qué archivos de encabezado incluir para realizar una función particular. No es una mala práctica incluir windows.h solo cuando deshabilita sus funciones innecesarias antes de incluirlo a través de la macro.

Defina NOMINMAX antes de incluir windows.h en su programa C++ porque, de lo contrario, obtendrá acceso a una macro min y max que interactuará con std::min y std::max .

El windows.h es un encabezado específico del sistema operativo y viene con el WSDK (Kit de desarrollo de software de Windows).

Se sugiere su uso para aumentar la utilidad de sus directivas #include bajo Windows; sin embargo, puede resultar extremadamente complejo para los desarrolladores de C++ de nivel de entrada o intermedio, por lo que deben usar windows.h.

En general, no use windows.h en ninguna situación en la que una función sea una intención porque la clave para una buena programación en C++ es nunca usar macros en lugar de una función.

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

Producción :

Successful!

Como archivo de encabezado específico de Windows, contiene todas las declaraciones de las funciones de la API de Windows, macros comunes y tipos de datos para varias funciones y subsistemas, y define funciones específicas de Windows extremadamente grandes como parte de su programa C++.

Es parte de casi todos los programas C++ basados en Windows debido a que no existe una alternativa razonable. Puede compilarlo aún más para excluir algunas funciones innecesarias y variables predefinidas.

Utilice WIN32_LEAN_AND_MEAN para mejorar la eficacia de Windows.h en C++

Cuando se define WIN32_LEAN_AND_MEAN antes de la llamada a windows.h, omitirá algunos de los encabezados de Windows menos útiles o necesarios. Es una de las soluciones más rápidas para aumentar la efectividad de windows.h.

Use VC_EXTRALEAN o WIN32_LEAN_AND_MEAN para reducir el tamaño del archivo de encabezado windows.h, pero el uso de cualquiera de estos preprocesadores a veces no satisface sus necesidades y necesita incluir otro archivo de encabezado.

Use la búsqueda de MSDN para nombrar una función que desee usar para que pueda decirle a qué archivo de encabezado pertenece.

Excluye las API menos útiles o de propósito específico, como DDE, Windows Sockets, RPC, Shell y Cryptography.

Además, la documentación de OPENFILENAMEW dice que commdlg.h es parte de windows.h, pero WIN32_LEAN_AND_MEAN lo excluye de windows.h, y puede incluirlo por separado porque commdlg.h utiliza macros definidas en windows.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;
}

Producción :

5

Como excluye algunas de las API de Windows que se usan con menos frecuencia, acelera el proceso de compilación y reduce el tamaño de los archivos de encabezado de Win32.

El windows.h lo incluye y muchos otros subtítulos; por lo tanto, definir específicamente uno puede maximizar los recursos de sus procesos de C++.

Incluya subtítulos para reemplazar Windows.h en un programa C++ para mejorar su eficacia

Los subtítulos de windows.h parecen estar estructurados de forma bastante estable. Puede incluir uno de los muchos encabezados más pequeños para definir sus necesidades en lugar de usar windows.h como un todo y solo usar una o dos funciones.

El windef.h contiene muchas de las funciones básicas de windows.h y se basa en más de siete mil líneas de código real. El fileapi.h define CreateFile, FindFirstFile y otras funciones similares.

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

Producción :

The operation is successful!

Además, puede usar synchapi.h para primitivas de sincronización (WaitForMultipleObjects, InitializeCriticalSection u otras funciones de sincronización que forman parte de windows.h).

El archivo de subencabezado debugapi.h es para OutputDebugString, IsDebuggerPresent y otras funciones de depuración.

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

Artículo relacionado - C++ Header