龙空技术网

我们需要先弄明白头文件的默认版本

漫漫开发路 50

前言:

现时我们对“头文件能包含头文件吗”都比较注意,小伙伴们都想要学习一些“头文件能包含头文件吗”的相关内容。那么小编同时在网络上网罗了一些对于“头文件能包含头文件吗””的相关知识,希望各位老铁们能喜欢,你们一起来学习一下吧!

对于 Windows 头文件来说,一个通用的规则是:如果你没有指定要包含的头文件的具体版本,则默认情况下,你包含的是最新版本的头文件。

举个例子

如果你安装了 Windows XP 平台 SDK,并在你的代码里包含了 ,则你将使用 Windows XP 系统对应的函数原型,结构体以及函数标志位等。

但除非你特别小心的设置各种细节,否则,你的程序将只会在 Windows XP 上运行。

如果你在代码里调用了 Windows XP 中新引入的 API 函数,则你的程序将不能在 Windows XP 系统之前的 Windows 上运行。为什么?

因为你的代码里导入的 API 函数依赖项,在旧的操作系统上无法解析。

如果你的代码里使用了一个 Windows XP 中的结构体,恰好这个结构体的定义和之前的旧版本相比,做了些更改,则你的程序也将不能在旧操作系统上运行,原因类似:结构体的大小发生了变化,直接运行可能导致程序内存访问违规而崩溃。

即使结构体的大小没有发生变化,在早期版本的 Windows 上运行时,使用 Windows XP 中引入的标志会给程序带来困难,因为这些早期版本不支持要传递的标志。根据所讨论的函数的编写方式,它可能会忽略“来自未来的标志”,或者可能会将其视为无效而拒绝它。

重点来了

如果你希望程序在旧版本的 Windows 上运行,有几个选项。

首先,可以通过在包含 windows.h 头文件之前定义一个或多个适当的符号来显式【降级】头文件。

例如:

#define WINVER 0x0400

#define _WIN32_WINNT 0x0400

#define _WIN32_WINDOWS 0x0400

#define _WIN32_IE 0x0400

#include

#include

#include

哦,哎呀,现在我们有一个混乱的世界,” 那么 _WIN32_WINNT、_WIN32_WINDOWS、_WIN32_IE 和 WINVER 有什么区别?”

我们下次会讨论这个话题,但你不会喜欢这个答案。

以上内容是从操作系统的角度来看的。当然,可以使用 Visual Studio 链接器的【延迟加载】功能等技术来避免创建导入依赖项,但这不在操作系统范围内。

总结

如果你需要你的程序可以跨域多个 Windows 版本运行,则你需要特别关注上面的”重点来了”章节。

请不畏繁琐,勇于当”细节帝”。(说的就是你)

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。

本文来自:《What is the default version of a header file?》

标签: #头文件能包含头文件吗 #头文件的用法 #头文件的概念