迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > 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 和其他调试函数。

上一篇:C++ 中的竞争条件

下一篇:没有了

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

本文地址:

相关文章

C++ 中的竞争条件

发布时间:2023/08/31 浏览次数:173 分类:C++

在本文中,我们将了解竞争条件的概念。 首先,我们将介绍线程,然后我们将通过示例讨论线程中的竞争条件。最后,我们将看到避免/控制竞争条件的解决方案。

在 C++ 中使用 TextOut() 更新文本

发布时间:2023/08/31 浏览次数:109 分类:C++

C++ 中的 TextOut() 函数使用选定的字体、背景颜色和文本颜色在指定位置写入字符串。 它属于`#include wingdi.h`。在本文中,您将学习如何使用 C++ 中的 TextOut() 函数更新任何文本。

用 C++ 测试射线三角形相交

发布时间:2023/08/28 浏览次数:76 分类:C++

测试光线-三角形相交可能需要数百万次测试,并且被认为是 C++ 中任何光线追踪器的核心操作之一(需要为每种几何基元类型提供不同的函数实现)。 本教程将教您如何用 C++ 编写射线-三角形

在 C++ 中取消引用迭代器

发布时间:2023/08/28 浏览次数:64 分类:C++

迭代器是 C++ 中的另一种强大机制,可帮助您迭代复杂的数据结构(例如树)和内部没有元素索引的集合(例如数组)。C++ 中的迭代器是什么 在 C++ 中,迭代器是一个类似于指针的对象,指向数

在 C++ 中实现双向链表的迭代器

发布时间:2023/08/28 浏览次数:193 分类:C++

由于双向链接数据结构由一组顺序链接的节点组成,其起始节点和结束节点的上一个和下一个链接都指向一个终止符(通常是哨兵节点或空),以方便链表的遍历。 本教程将教您如何在 C++ 中实

用 C++ 编写系统调用

发布时间:2023/08/28 浏览次数:161 分类:C++

本文将讨论从 C++ 编写的程序中调用写入系统的方法。 首先,我们将快速刷新系统调用,特别是 write 系统调用及其原型。稍后,我们将讨论从 C++ 程序调用 write 系统调用。

在 C++ 中获取鼠标位置

发布时间:2023/08/28 浏览次数:137 分类:C++

本文讲述如何在 C++ 中获取鼠标位置。在 C++ 中获取鼠标位置 C++ 提供了 GetCursorPos 方法来获取鼠标光标的 x 和 y 位置。

C++ 中的多维向量

发布时间:2023/08/28 浏览次数:152 分类:C++

这个简短的编程教程是关于 C++ 中多维向量的介绍。 向量是可以像 C++ 中的动态数组一样存储数据的容器,具有自动调整大小的功能。C++ 中的多维向量

在 C++ 中释放 std::vector 对象

发布时间:2023/08/28 浏览次数:52 分类:C++

本文将解释如何在 C++/C 中释放 std::vector 对象。 首先,我们将了解释放的自编码方式,然后,我们将研究如何在 C++ 中动态释放 std::vector 对象。在 C++ 中释放对象

扫一扫阅读全部技术教程

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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便