如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))

摘要:
作者:自VS2010以来,zyl910提供了一个平台工作集选项来配置VC的编译版本。设置好平台的工作集后,环境变量宏会发生变化,“VC++目录”、“预处理器定义”等地方也会发生变化。当平台工具集设置为“VisualStdio2013 WindowsXP”时,$为“v120_xp”,$为为“120”,“_USING_V110_SDK71_”将添加到“继承值”中。然后再次尝试v110和v110 _ Xp和其他平台工作集,从中可以找到平台工作集的规则--$:name。E、 g.v110、v110_ xp、v120、v120_ xp$:平台工作集版本号。

作者:zyl910

  从VS2010开始,提供了一个平台工作集(Platform ToolSet)选项用于配制vc编译版本。到了VS2012,更是因为默认平台工具集不支持WindowsXP,导致经常需要切换到xp版平台工具集,VS2013也是如此。在某些时候,我们需要使用条件编译判断平台工具集的版本去做不同的操作,而VS中没有提供一个标准的检测办法。本文就是我的一些心得。

  在设置了平台工作集后,环境变量宏会发生变换,而且“VC++目录”、“预处理器定义”等地方也会发生一些变化。

  以VS2013为例,注意观察“Visual Stdio 2013 (v120)”、“Visual Stdio 2013 - Windows XP (v120_xp)”的区别。

  先看“C/C++” ->“预处理器” ->“预处理器定义”与平台相关的环境变量宏:

当平台工具集设为“Visual Stdio 2013 (v120)”时,$(PlatformToolset)为“v120”,$(PlatformToolsetVersion)为“120”。

如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))第1张

当平台工具集设为“Visual Stdio 2013 - Windows XP (v120_xp)”时,$(PlatformToolset)为“v120_xp”,$(PlatformToolsetVersion)为“120”,而“继承的值”中多了一项“_USING_V110_SDK71_”。
如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))第2张

  再看“VC++目录”与SDK目录相关的环境变量宏:

当平台工具集设为“Visual Stdio 2013 (v120)”时,“VC++目录”是指向默认Windows SDK路径(Windows SDK 8.1)。
如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))第3张

当平台工具集设为“Visual Stdio 2013 - Windows XP (v120_xp)”时,“VC++目录”是指向Windows SDK 7.1路径。
如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))第4张

  然后可以再试试v110、v110_xp等平台工作集,从中可以找到规律——
$(PlatformToolset):平台工作集名称。如 v110、v110_xp、v120、v120_xp
$(PlatformToolsetVersion):平台工作集版本号。如 110、120。注意xp版平台工具集(v110_xp、v120_xp)使用相同的版本号(110、120)
VC++目录:自动绑定相关的Windows SDK。v120是Windows SDK 8.1,v110是Windows SDK 8.0,而v110_xp、v120_xp是Windows SDK 7.1。
环境变量宏:对于xp版平台工具集,“继承的值”中会多一项“_USING_V110_SDK71_”。

  根据上面的规律,很容易区分是不是兼容WindowsXP的平台工具集。判断是否存在“_USING_V110_SDK71_”宏就行。
  如果你像我一样担心“_USING_V110_SDK71_”这个宏名称可能会增加依赖性的话,还可以使用另一种办法——根据Windows SDK的版本来判断是不是兼容WindowsXP的平台工具集。具体办法是使用_WIN32_WINNT宏,若其值小于等于0x0601(Windows7)表示兼容WindowsXP,而大于等于0x602(Windows8)时表示不兼容WindowsXP。例如——

#if (_WIN32_WINNT >= 0x602)
    // 不兼容WindowsXP的平台工具集
#else
    // 兼容WindowsXP的平台工具集
#endif

  现在唯一的问题就是判断具体的平台工作集版本了。$(PlatformToolsetVersion)这样的环境变量宏似乎不会自动转为C语言宏,该怎么办呢?
  解决办法很简单,在“预处理器定义”中定义自己的宏就行了,例如添加一条“_MSC_PLATFORM_TOOLSET=$(PlatformToolsetVersion)”
如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))第1张

  然后就能在程序中通过_MSC_PLATFORM_TOOLSET宏来判断平台工具集了,例如——

#if (_MSC_PLATFORM_TOOLSET > 100)    // Visual Stdio 2010 (v100)
...
#endif

 


参考文献
~~~~~~~~

Visual Studio: how to check used C++ platform toolset programmatically. http://stackoverflow.com/questions/13794130/visual-studio-how-to-check-used-c-platform-toolset-programmatically
Using the Windows Headers. http://msdn.microsoft.com/en-us/library/aa383745.aspx

免责声明:文章转载自《如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue 点击显示隐藏,鼠标移动上去显示隐藏IDEA 创建 web项目下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

常用VC插件

Visual Assist(强烈推荐) 网址:http://www.wholetomato.com/功能:VA从5.0一直到现在的VAX,功能越来越强大,除了以前版本中的自动识别各种关键字,系统函数,成员变量,自动给出输入提示,自动更正大小写错误,自动标示错误等等以外,最新的版本中还在WorkSpace窗口中加入一个VA View,可以更方便的查找工程中的...

IntelliJ IDEA 编译程序出现 非法字符 的 解决方法

IntelliJ IDEA 编译程序出现 非法字符 的 解决方法 idea报Error:(1, 21) java: 非法字符: 'ufffd' 的解决办法 韩风666 2020-04-30 21:53:56 1043 收藏 分类专栏: javaee报错 版权 方法1,直接去掉汉字或包名 方法2, 注意:经常不灵 点击该类,选择 utf-16转码,再u...

现在可用——Windows Azure SDK 1.6

微软不久前宣布了Windows Azure SDK 1.6 和 Windows Azure Tools for Visual Studio 1.6的发布。现在人们可以通过WebPI来下载这个最新版本。 当你下载并安装完该SDK时,你将发现 该SDK 1.6与SDK 1.5兼容,这意味着你仍然可以使用1.5版的程序集。但是Visual Studio To...

顺丰丰桥软件开发工具包 (.NET)

丰桥 - 一站式对接服务平台, 打通客户与顺丰系统之间的信息流, 实现物流供应链一体化. 随着一个电商项目和顺丰合作, 信息流对接就是我们开发的事了. 顺丰通过丰桥提供了一些开放接口, 不过丰桥提供的 SDK 非常简陋, 对 .NET 的支持就更差了. 于是就有了这个项目 sf-express-sdk-net 主要接口集成: 接口 接口方式 描述...

openwrt 代码框架分析

这次讲讲openwrt的结构. 1.代码上来看有几个重要目录package, target, build_root, bin, dl....---build_dir/host目录是建立工具链时的临时目录---build_dir/toolchain-是对应硬件的工具链的目录---staging_dir/toolchain- 则是工具链的安装位置---targ...

libusb-win32 在visual studio2008中成功编译回忆录

关于这个项目不用多说 介绍 libusb是一个针对usb通讯的库. 使用它, 你不需要知道操作系统的细节, 你只需要对USB有足够的了解即可. 它也不需要你写驱动, 所有的工作都可以在用户态完成. 使用方法很简单, 这里有一个示例:http://sourceforge.net/apps/trac/libusb-win32/wiki/libusbwin32...