如何判断平台工具集去做条件编译(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,一经查实,立即删除!

相关文章

gerber文件怎么导贴片坐标_利用Gerber文件生成贴片坐标及元件位置图的方法技巧...

利用Gerber文件生成贴片坐标及元件位置图的方法技巧利用Gerber文件生成贴片坐标及元件位置图的方法技巧2010-10-11 21:59Gerber文件是所有电路设计软件都可以产生的文件,在电子组装行业又称为模版文件(stencil data),在PCB制造业又称为光绘文件。可以说Gerber文件是…

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

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

SQL语言的分类

SQL语言的分类 SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML, 数据定义语言DDL,数据控制语言DCL。 1 数据查询语言DQL Q Query 数据查询语言DQL用于检索数据库基本结构是由SELECT子句,FROM子句,…

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

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

使用eclipse进行web开发的3个lib文件夹

1、右击project>Build Path>Configure Build Path(一般是在你的项目文件夹中手动创建一个lib文件夹,里面设置若干子文件夹存放不同的jar包,然后通过Configure Build Path导入) 存放:eclipse用来编译java文件、编…

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

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

asp.net中,%#%,%=%和%%分别是什么意思,有什么区别

在asp.net中经常出现包含这种形式<%%>的html代码,总的来说包含下面这样几种格式&#xff1a; 一. <%%> 这种格式实际上就是和asp的用法一样的&#xff0c;只是asp中里面是vbscript或者javascript代码&#xff0c;而在asp.net中是.net平台下支持的语言。 特别注意:…

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

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

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

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

密码强度正则

6位数字字母特殊字符 |6位数字、字母、特殊字符两两组合 | 6位 var threeRegex new RegExp("^(?.{6,})(?.*[a-zA-Z])(?.*[0-9])(?.*\\W).*$", "g"); var twoRegex new RegExp("^(?.{6,})(((?.*[a-zA-Z])(?.*\\W))|((?.*[0-9])(?.*\\W))|((…

laravel mysql 队列_Laravel 队列使用

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

高手速成android开源项目【项目篇】

主要介绍那些Android还不错的完整项目&#xff0c;目前包含的项目主要依据是项目有意思或项目分层规范比较好。Linux项目地址&#xff1a;https://github.com/torvalds/linuxAndroid项目地址&#xff1a;https://android.googlesource.com/或https://github.com/android以上两个…

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

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

机器学习1k近邻

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

mysql服务器的线程数查看方法_MySQL服务器线程数的查看方法详解

本文实例讲述了MySQL服务器线程数的查看方法。&#xff0c;具体如下&#xff1a;mysql重启命令&#xff1a;/etc/init.d/mysql restartMySQL服务器的线程数需要在一个合理的范围之内&#xff0c;这样才能保证MySQL服务器健康平稳地运行。Threads_created表示创建过的线程数&…

[No000003]现代版三十六计,计计教你如何做人

《现代版三十六计,计计教你如何做人》 …………………………………………………………………………………… 第1计施恩计 在人际交往中,见到给人帮忙的机会,要立马扑上去,像一只饥饿的松鼠扑向地球上的最后一粒松籽. 因为人情就是财富,人际关系一个最基本的目的就是结人情,有人…

mysql 重置root密码 远程访问_重置mysql的root密码以及设置mysql远程登陆权限

root密码忘记&#xff0c;重置mysql的root密码&#xff1a;t一、修改mysql的配置文件my.cnf1.在[mysqld]的段中加上一句&#xff1a;skip-grant-tables[mysqld]datadir/var/lib/mysqlsocket/var/lib/mysql/mysql.sockskip-name-resolveskip-grant-tables保存并且退出vi。(或执行…

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…

vagrant使用centos的环境安装..

vagrant这货挺好用的..简要就是, 下好virtualbox, vagrant, 然后下个你需要的box. 然后vagrant box add boxname boxpath就行. 然后在合适的地方vagrant init就能创建好虚拟机, 然后vagrant up是开启, vagrant ssh是通过ssh连接过去, 可以装一个zsh , 配置oh my zsh啥的, 然后安…

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…