#include <Windows.h> 是不好的做法吗?

Posted

技术标签:

【中文标题】#include <Windows.h> 是不好的做法吗?【英文标题】:Is #include <Windows.h> bad practice? 【发布时间】:2020-09-07 07:12:42 【问题描述】:

我认为#include &lt;bits/stdc++.h&gt; is bad practice 已被普遍接受,部分原因是它解析并包含每个标准标头,这几乎总是不必要的(它也是不可移植的,但这超出了我的观点)。与using namespace std; 结合使用会更糟,因为现在您的命名空间中有大量常用名称,例如next

然而,似乎#include &lt;Windows.h&gt; 大部分被认为是可以的(我见过的大多数 Win32 程序都使用它),尽管它在概念上与#include &lt;bits/stdc++.h&gt; + using namespace std; 的组合做同样的事情。

根据Wikipedia:

windows.h 是 C 和 C++ 编程语言的特定于 Windows 的头文件,其中包含 Windows API 中所有函数的声明、Windows 程序员使用的所有常用宏,以及各种功能和子系统使用的所有数据类型。它定义了大量可在 C 中使用的 Windows 特定函数。

为什么会这样?是否可以包含我们使用的特定标头而不包含&lt;Windows.h&gt;

【问题讨论】:

windows.h中所有的函数声明都是dll函数的声明。这些 dll 包含很多功能。您可以从编译中排除其中一些。但是在预编译的头文件中包含 windows.h 应该没问题。 没关系,因为大多数时候没有合理的替代方案。 @john 我是 Windows 编程新手。为什么包含特定的标头我们不需要一个合理的替代方案? 其 API 的 Microsoft 文档说包括 windows.h。虽然它还列出了包含定义的特定标头,但我怀疑您是否可以只包含该标头。如果所有其他 Windows 标头都存在顺序依赖性(您必须自己弄清楚),我不会感到惊讶。 @Ayxan 如果您可以找到所需的特定文档标题,那么很好。但对于大多数 Win32 API 编程来说,#include &lt;windows.h&gt; 是唯一记录在案的可能性。 【参考方案1】:

Msdn 文档明确告诉您 (a) 在哪个头文件中声明了一个函数,以及 (b) 您应该包含哪个头文件。

大多数函数都会告诉您包含windows.h,例如SendMessage

有些功能是后来添加的或有非常具体的用例,只能通过其他头文件使用,例如SetupDiEnumDeviceInfo。

所以不,听从他们的建议也不错。但是,我强烈建议在通过宏添加之前禁用它的某些部分,例如

#define NOMINMAX
#include <Windows.h>

因为否则你会得到一个min 和一个max 宏,它们会干扰std::minstd::max

【讨论】:

你提供的链接说它是SendMssagewinuser.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

如果在调用 之前定义,将绕过一些较少使用的 windows 标头。

【讨论】:

以上是关于#include <Windows.h> 是不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章

Windows编程——API左键连线

#include <windows.h> 导致很多语法错误

#include <Windows.h> 是不好的做法吗?

Windows编程——API双人五子棋

Windows获取进程完整路径

使用Windows GDI 截取图片