增强 C++ 中 windows.h 的有效性
人们普遍认为 #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++ 中的竞争条件
发布时间: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++ 中释放对象