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

作者: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”。

当平台工具集设为“Visual Stdio 2013 - Windows XP (v120_xp)”时,$(PlatformToolset)为“v120_xp”,$(PlatformToolsetVersion)为“120”,而“继承的值”中多了一项“_USING_V110_SDK71_”。

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

当平台工具集设为“Visual Stdio 2013 (v120)”时,“VC++目录”是指向默认Windows SDK路径(Windows SDK 8.1)。

当平台工具集设为“Visual Stdio 2013 - Windows XP (v120_xp)”时,“VC++目录”是指向Windows SDK 7.1路径。

  然后可以再试试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)”

  然后就能在程序中通过_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

 

转载于:https://www.cnblogs.com/zyl910/p/vcplatformtoolsetversion.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#语言基础编程-转义符

C#转义字符: 引言 为了在程序中能够控制字符的输出以及区分开双引号和单引号(双引号和单引号在程序中标示里面的内容为字符串和字符),所以用一种特殊的字符常量;是以反斜线”\”开头,后跟一个或几个字符。让其具有特定…

图片图层隐写_【软件】imageIN · 图影-隐藏文件到图片,简单轻快的图片隐写工具...

还记得以前的图种制作吗,今天给大家分形下一个相关的工具。度盘下载(imageIN Beta1.0 (2.18MB)) :pan.baidu.com/s/1hqve8YS官网下载:本地下载这是一个能把图片中嵌入文件、文本、隐藏水印的隐写工具这种嵌入是基于图像本身的而不是基于文件的…

mysql 密码长度约束_MySQL简单操作【1、在cmd下MySQL的运行及简单增删改查】

上篇文章介绍了在Windows10下安装MySQL,本篇文章介绍cmd下简单的操作。1、登录 MySQL当 MySQL 服务已经运行时, 我们可以通过 MySQL 自带的客户端工具登录到 MySQL 数据库中, 首先打开命令提示符, 输入以下格式的命名:mysql -h 主机名 -u 用户名 -p参数说明&#xf…

mysql十大报错_MySQL十大报错函数

1.Floor()round() 遵循四舍五入把原值转化为指定小数位数,如:round(1.45,0) 1;round(1.55,0)2floor()向下舍入为指定小数位数 如:floor(1.45,0) 1;floor(1.55,0) 1ceiling()向上舍入为指定小数位数 如:ceiling(1.45,0) 2;ceili…

.NET Framework 4 不能先解压再使用setup.exe安装的解决方法

微软.NET Framework离线安装包有时无法做到断网离线安装,仍然需要下载某些文件后才能继续安装,速度慢不说,安装前还必须要联网。 这时就可以自己用7z什么的解压微软的安装包,然后收集整合要下载的文件后,就可以通过解压…

laravel mysql 队列_Laravel 队列使用

Laravel 队列使用1.修改根目录.env文件的 **QUEUE_CONNECTION **字段配置为 databaseLaravel可配置多种队列驱动,包括 "sync", "database", "beanstalkd", "sqs", "redis", "null"(具体参见app/config…

Swift基础语法: 30 - Swift的基类, 子类, 重写, 重写方法, 重写属性, 防止重写

前面我们讲了有关于脚本语法的基本认识以及使用, 现在让我们来看看Swift的其他东西: 1.基类 所谓的基类, 就是OC中的父类, 不继承任何类, 就叫做基类, 让我们来看看例子: class Vehicle {var currentSpeed 0.0var description: String {return "traveling at \(currentSp…

机器学习1k近邻

自己一直学习计算机视觉方面的东西,现在想学习一下数据挖掘跟搜索引擎,自己基础也有点薄弱,看朱明的那本数据挖掘,只能片面的了解这个数据挖掘。不过最近有一本书 机器学习实战,于是乎通过实战的形式了解一下基本的算法…

C#中枚举类型和int类型的转化

先定义一个枚举类型 public enum PropertyType { 小学 0, 初中, 高中&#xff0c;大学 }; int ->enum int d2; PropertyType a(PropertyType)d; int <- enum PropertyType d PropertyType.小学; int a Convert.ToInt32(d); Enum类有关的方法 E…

linux mysql odbc驱动安装_MySQL ODBC 驱动安装

阅读目录一、在线安装1、yum在线安装驱动2、配置驱动3、测试连接二、编译安装1、MySQL创建测试用户和测试库2、安装驱动3、配置驱动4、测试一、在线安装1、yum在线安装驱动# yum -y installunixODBC#yum -y install mysql-connector-odbc2、配置驱动(1)查看驱动程序相关信息# c…

通过 HTTPS 和 SSL 确保 Windows Azure 网站 (WAWS) 安全

编辑人员注释&#xff1a;本文章由 Windows Azure 网站团队的项目经理 Erez Benari 撰写。 随着身份盗窃和各种形式的网络犯罪迅速增多&#xff0c;使用安全套接字层 (SSL) 对网站进行保护变得越来越重要和普遍。如果将网站托管在 Windows Azure 网站 (WAWS) 上&#xff0c;您可…

mysql之多表查询

今天在项目中遇到一个数据库查询的问题&#xff1a;三张表分别放置不同的东西&#xff1a;分享的音频相关数据、分享的文字图片说说、分享的主题相关数据。所有分享的东西都可看做新鲜事&#xff0c;现在要求从这三张表将相同的几个字段的数据全部查找出来按照发布时间先后排序…

设立SharePoint2010列表的项目级权限

设置SharePoint2010列表的项目级权限 在SharePoint2010中我们经常会用到这样的权限设置&#xff0c;在一个列表中可以存储多个人输入的数据&#xff0c;但每个人只能看到自己的那部分数据。也就是多个人共同维护一个列表&#xff0c;但各自只能查看、编辑、删除自己录入的那部分…

二叉树第i层中的所有结点_讲透学烂二叉树(二):图中树的定义amp;各类型树的特征分析...

日常中我们见到的二叉树应用有&#xff0c;Java集合中的TreeSet和TreeMap&#xff0c;C STL中的set、map&#xff0c;以及Linux虚拟内存的管理&#xff0c;以及B-Tree&#xff0c;B-Tree在文件系统&#xff0c;都是通过红黑树去实现的。虽然之前写过《再谈堆排序&#xff1a;堆…

mysql sqlsugar_.net core +mysqlSugar(最为简单的增删改查)

首先建立.net Core API - empty 这个就不说了然后创建新的Controller记得添加路由[Route("api/Users")]然后在Nuget Packages安装 所需安装包这里是用mysql所以下载如下的mysqlSugarCore(切记不要忘记安装Mysql.Data)创建实例化class文件DbText.cs用于连接数据库&…

关于eclipse的indigo版中文注释时字体太小的问题(转)

eclipse目前最新版代号indigo, 在win7上使用时中文注释时字体太小的问题. 为什么会这样? 首先我们应该知道, 在win7系统中, font是有"显示"和"隐藏" 状态的. 默认情况下, eclipse使用的默认字体courier new是处于 "隐藏"下的. 这样当eclipse打开…

centos 多个mysql数据库_CentOS6.5 一台服务器同时安装多个Mysql数据库

建用户与组groupadd mysqluseradd -g mysql mysql下载源码&#xff1a;wget https://downloads.mariadb.org/interstitial/mariadb-10.1.10/source/mariadb-10.1.10.tar.gztar -xvf mariadb-10.1.10.tar.gz1、编译&#xff1a;cmake . -DCMAKE_INSTALL_PREFIX/var/lib/mysql33…

linux ll 文件大小单位_该如何改善 Linux 系统性能?

系统性能一直是一个受关注的话题&#xff0c;如何通过最简单的设置来实现最有效的性能调优&#xff0c;如何在有限资源的条件下保证程序的运作&#xff0c;ulimit 是我们在处理这些问题时&#xff0c;经常使用的一种简单手段。ulimit 是一种 linux 系统的内键功能&#xff0c;它…

深入Javascript中apply、call、bind

最近在看一下node package的源码&#xff0c;发现很多里面都包含了function这个对象的apply、call、bind这三个方法&#xff0c;于是想拿出来再看看。。 apply、call 在 javascript 中&#xff0c;call 和 apply 都是为了改变某个函数运行时的上下文&#xff08;context&#x…

优秀案例!教您如何设计现代简约风格网页

我们看到越来越多的设计师开始拥抱简约的网站设计方法&#xff0c;消除网站不必要的元素&#xff0c;保留真正重要的内容&#xff0c;干净、直观的设计&#xff0c;就像今天的我们将展示的这些网站。 下面是一组不同风格的简约设计的网站例子&#xff0c;美丽的导航、整洁的菜单…