增强 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 和其他调试函数。
相关文章
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()函数在串口监视器上显示变量值。