美文网首页
【Windows】关于Windows版本的各个宏

【Windows】关于Windows版本的各个宏

作者: mercurygear | 来源:发表于2016-11-25 21:17 被阅读152次

在我们的预编译头文件stdafx.h(或者targetver.h)中,需要定义我们的开发的程序目标Windows版本(一般是最低支持版本),看到WINVER、_WIN32_WINDOWS、_WIN32_WINNT、NTDDI_VERSION这么多版本相关宏,是不是觉得头大,虽然简单的全部配置成同个版本就行了,但是你知道这些宏有什么不同,为什么会这样吗?

历史渊源(来自The Old New Thing

Windows是一个持续发展中的系统,经过这么几十年的时间,从16位到32位到64位,经过了不知道多少个版本,为了保持兼容性,再版本不停的升级变化中,自然就引入了这么多个宏。
如WINVER这个宏的历史可以追溯到16位的windows,当时用于做头文件的版本控制;后来windows NT出现了,因而又引入了_WIN32_WINNT来隔离开NT相关的特性;再后来win95出现了,这时又引入了_WIN32_WINDOWS来控制哪些win95引入的特性;
上述三个宏在后续的windows开发中就这么一直存在了下来,到现在来说WINVER还是在很多的windows头文件中出现,_WIN32_WINDOWS由于从xp开始,windows都使用nt内核,就很少用了,_WIN32_WINNT这个宏现在还是在大量使用的。
到了Vista的时代,windows的开发人员也觉得是时候要终结一下这种乱象了,于是sdk组和ddk组的人一起合作,引入了NTDDI_VERSION这个宏(sdkddkver.h),只要单独定义NTDDI_VERSION这个宏即可。
但是这里有个前提,就是需要你的程序面向的是Vista以上的版本;如果你还要支持到XP,那么还必须再定义_WIN32_WINNT这个宏。这是因为如果只定义NTDDI_VERSION这个宏而不定义_WIN32_WINNT的话,在sdkddkver.h中可以到,_WIN32_WINNT会被默认定义为Vista的版本。(其他两个宏是保持和_WIN32_WINNT一致)

总结

用VS2008创建工程的时候,会自动帮我们创建targetver.h头文件,我们只需要在这里定义windows相关的版本宏即可。
假如你的程序需要支持的最低windows版本是xp,那就定义_WIN32_WINNT和NTDDI_VERSION;
假如你的程序最低支持的windows版本是vista,那只定义NTDDI_VERSIN即可。
另外,sdkddkver.h已经帮我们定义好了各个windows发行版本对应的版本号,我们直接用这些宏就更加直观了。

相关文章

网友评论

      本文标题:【Windows】关于Windows版本的各个宏

      本文链接:https://www.haomeiwen.com/subject/fsgipttx.html