#include <Windows.h> 是不好的做法吗?
Posted
技术标签:
【中文标题】#include <Windows.h> 是不好的做法吗?【英文标题】:Is #include <Windows.h> bad practice? 【发布时间】:2020-09-07 07:12:42 【问题描述】:我认为#include <bits/stdc++.h>
is bad practice 已被普遍接受,部分原因是它解析并包含每个标准标头,这几乎总是不必要的(它也是不可移植的,但这超出了我的观点)。与using namespace std;
结合使用会更糟,因为现在您的命名空间中有大量常用名称,例如next
。
然而,似乎#include <Windows.h>
大部分被认为是可以的(我见过的大多数 Win32 程序都使用它),尽管它在概念上与#include <bits/stdc++.h>
+ using namespace std;
的组合做同样的事情。
根据Wikipedia:
windows.h 是 C 和 C++ 编程语言的特定于 Windows 的头文件,其中包含 Windows API 中所有函数的声明、Windows 程序员使用的所有常用宏,以及各种功能和子系统使用的所有数据类型。它定义了大量可在 C 中使用的 Windows 特定函数。
为什么会这样?是否可以包含我们使用的特定标头而不包含<Windows.h>
?
【问题讨论】:
windows.h中所有的函数声明都是dll函数的声明。这些 dll 包含很多功能。您可以从编译中排除其中一些。但是在预编译的头文件中包含 windows.h 应该没问题。 没关系,因为大多数时候没有合理的替代方案。 @john 我是 Windows 编程新手。为什么包含特定的标头我们不需要一个合理的替代方案? 其 API 的 Microsoft 文档说包括 windows.h。虽然它还列出了包含定义的特定标头,但我怀疑您是否可以只包含该标头。如果所有其他 Windows 标头都存在顺序依赖性(您必须自己弄清楚),我不会感到惊讶。 @Ayxan 如果您可以找到所需的特定文档标题,那么很好。但对于大多数 Win32 API 编程来说,#include <windows.h>
是唯一记录在案的可能性。
【参考方案1】:
Msdn 文档明确告诉您 (a) 在哪个头文件中声明了一个函数,以及 (b) 您应该包含哪个头文件。
大多数函数都会告诉您包含windows.h
,例如SendMessage
有些功能是后来添加的或有非常具体的用例,只能通过其他头文件使用,例如SetupDiEnumDeviceInfo。
所以不,听从他们的建议也不错。但是,我强烈建议在通过宏添加之前禁用它的某些部分,例如
#define NOMINMAX
#include <Windows.h>
因为否则你会得到一个min
和一个max
宏,它们会干扰std::min
和std::max
。
【讨论】:
你提供的链接说它是SendMssage
在winuser.h
中
@Ayxan ... 从字面上看,接下来的两个词是“(包括 Windows.h)”。
@Ayxan 基本上,Windows 标题是一团糟。虽然看起来你可以在实践中为特定任务包含更具体的标题,但它不起作用(至少不是我最后一次尝试它,那是不久前)。
@Timbo 我将该部分理解为“此标头包含在 Windows.h 中。如果您已经包含 Windows.h,则无需再次包含它”。我是 Windows 编程新手,不确定这是否有意义
@john 你的评论加上another comment 似乎为我解释了它。【参考方案2】:
bits/stdc++.h
是 编译器特定 标头。如果你用不同的编译器编译你的代码,它可能存在也可能不存在。它不是标准 C++ 的一部分。它是访问 C++ 标准库的快捷方式。
windows.h
是一个特定于操作系统的 标头。如果您正在为 Windows 进行编译,则需要它,并且每个支持 Windows 的编译器都可以使用它。它不一定与编译器一起提供;它带有 Windows 软件开发工具包。它提供对 Windows API 的访问。
您也许可以在 Windows 下微调您的 #include
指令,但 Windows 太混乱了,除非您真的想花时间深入研究它,否则最好只使用 windows.h
。
【讨论】:
我明白你的意思。 winapi 怎么会这么乱,而且似乎没有做任何工作来改进它或者制作一个新的 C++ API? @Ayxan -- 因为微软。 @ayx Windows API 巨大,实际上已经有几十年的历史了。它被成千上万的应用程序使用。我怀疑在不破坏某人的构建的情况下,您可以想象在标题中进行很多更改。很容易称之为一团糟。同样容易忽略为清理它而进行的重大投资。这项工作的名称为 Windows 运行时。 @IInspectable 有趣的点。您是说 C++/WinRT 中的 Windows 运行时是新的/干净的 WinAPI? @ayx Windows 运行时独立于 C++/WinRT。后者投射前者,并为 C++ 开发人员提供对 API 的便捷访问。 Windows 运行时本身只是提供了一个干净的 API 表面,以与语言无关的方式公开。它继承了 Windows API 作为未来系统服务的接口。【参考方案3】:有各种定义,特别是
#define WIN32_LEAN_AND_MEAN
如果在调用
【讨论】:
以上是关于#include <Windows.h> 是不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章