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

在我们的预编译头文件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发行版本对应的版本号,我们直接用这些宏就更加直观了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 注:这篇文章主要是写给歪果仁看的,之所以先写英文版,主要是英文版写起来简单,没有天朝那么复杂的环境背景需要考虑吧 ...
    NTFS阅读 843评论 2 3
  • 一、基础知识篇:Http Header之User-AgentUser Agent中文名为用户代理,是Http协议中...
    iPhone阅读 15,869评论 0 13
  • 部分内容转载自搜狗百科 cmd是command的缩写.即命令提示符(CMD),是在OS / 2 , Windows...
    青冥之上阅读 2,416评论 0 24
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,904评论 18 139
  • 朋友圈里的一条分享,说儿童游乐场,简直可以成为检验父母,是否过度焦虑担心的地方。 那些处处跟在孩子后面,各种管着叫...
    吴在天阅读 523评论 1 6