迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C++ >

增强 C++ 中 windows.h 的有效性

作者:迹忆客 最近更新:2023/08/31 浏览次数:

人们普遍认为 #include <Windows.h>#include <bits/stdc++.h> 头文件一样不好。 在本文中,您将了解 Windows.h 有用性背后的真相,以及它在 C++ 中是好是坏。

因为 windows.h 包含/解析每个标准头(其中大多数是不必要的且不可移植的),并且在与 using namespace std; 结合使用时甚至更多,所以它在 C++ 程序的命名空间中具有大量通用名称,如 next ,这让您无法 低效地使用其他功能。

然而,即使它的执行与bits/stdc++.h相同并使用命名空间std,这也是Win32程序的主要要求; 合并。


在C++程序中定义NOMINMAX以增强Windows.h的有效性

与 windows.h 相关的 MSDN 文档明确定义了要包含哪些头文件来执行特定功能。 仅当您在通过宏包含它之前禁用其不必要的功能时,才包含 windows.h 并不是一个坏习惯。

在 C++ 程序中包含 windows.h 之前定义 NOMINMAX,否则,您将可以访问将与 std::min 和 std::max 交互的 min 和 max 宏。

windows.h 是特定于操作系统的标头,并随 WSDK(Windows 软件开发工具包)一起提供。

建议使用它来增加 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 效率的更快解决方案之一。

使用 VC_EXTRALEAN 或 WIN32_LEAN_AND_MEAN 可以减小 windows.h 头文件的大小,但使用这些预处理器中的任何一个有时都无法满足您的需求,并且您需要包含另一个头文件。

使用MSDN搜索来命名您要使用的函数,以便它可以告诉您它属于哪个头文件。

它排除了不太有用或特定用途的 API,例如 DDE、Windows Sockets、RPC、Shell 和加密技术。

此外,OPENFILENAMEW 的文档表示 commdlg.h 是 windows.h 的一部分,但 WIN32_LEAN_AND_MEAN 将其从 windows.h 中排除,并且您可以单独包含它,因为 commdlg.h 使用 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;
}

输出:

5

由于它排除了一些不常用的 Windows API,因此它加快了构建过程并减小了 Win32 头文件的大小。

windows.h 包含它和许多其他子标头; 因此,专门定义一个可以最大限度地利用 C++ 进程的资源。

在 C++ 程序中包含子标头来替换 Windows.h 以增强其有效性 windows.h 的子标题的结构似乎相当稳定。 您可以包含许多较小的标头之一来定义您的需求,而不是使用 windows.h 作为一个整体并仅使用其一两个功能。

Windef.h 包含 windows.h 的许多基本函数,并且基于七千多行实际代码。 fileapi.h 定义了 CreateFile、FindFirstFile 和其他类似函数。

#include <windef.h>
#include <fileapi.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 进行同步原语(WaitForMultipleObjects、InitializeCriticalSection 或windows.h 中的其他同步函数部分)。

debugapi.h 子头文件用于 OutputDebugString、IsDebuggerPresent 和其他调试函数。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Arduino 中停止循环

发布时间:2024/03/13 浏览次数:444 分类:C++

可以使用 exit(0),无限循环和 Sleep_n0m1 库在 Arduino 中停止循环。

Arduino 复位

发布时间:2024/03/13 浏览次数:315 分类:C++

可以通过使用复位按钮,Softwarereset 库和 Adafruit SleepyDog 库来复位 Arduino。

Arduino 的字符转换为整型

发布时间:2024/03/13 浏览次数:181 分类:C++

可以使用简单的方法 toInt()函数和 Serial.parseInt()函数将 char 转换为 int。

Arduino 串口打印多个变量

发布时间:2024/03/13 浏览次数:381 分类:C++

可以使用 Serial.print()和 Serial.println()函数在串口监视器上显示变量值。

Arduino if 语句

发布时间:2024/03/13 浏览次数:123 分类:C++

可以使用 if 语句检查 Arduino 中的不同条件。

Arduino ICSP

发布时间:2024/03/13 浏览次数:214 分类:C++

ICSP 引脚用于两个 Arduino 之间的通信以及对 Arduino 引导加载程序进行编程。

使用 C++ 编程 Arduino

发布时间:2024/03/13 浏览次数:127 分类:C++

本教程将讨论使用 Arduino IDE 在 C++ 中对 Arduino 进行编程。

Arduino 中的子程序

发布时间:2024/03/13 浏览次数:168 分类:C++

可以通过在 Arduino 中声明函数来处理子程序。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便