本文概述
最近在将自己所在的项目升级到VS2015,本文记录和整理了一些在升级VS2015时自己所查阅的一些VS2015新功能资料,随着自己阅读的不断延伸,我会持续更新。这篇日志的主要内容如下所示:
- 调试部分: 将介绍一些有助于调试的新功能;
- 团队协作部分:主要介绍在VS2015中可以完成的git操作, 可以在VS2015中完成Git flow操作, 下载GitFlow for Visual Studio 2015;
- 可能会影响编译部分的改动: 在升级旧工程过程中,遇到了一些编译问题,将会把自己遇到的一些问题和相关解决方案做一些介绍,希望能对有类似问题的朋友有所帮助。
1. 调试部分##
1.1 断点设置
VS2015引入了断点设置功能,当鼠标悬浮在断点上时,会出现设置按钮和断点禁用按钮。在断点设置按钮中,有如下设置:
- Conditional statement:使用户能够自定义断点触发表达式,只有表达式为true时,触发断点;
- Hit counts:只有当断点触发累积到一定次数后激活;
- Filter:只有当触发某个进程、线程或MachineID时触发;
- Tracepoints: 可设置断点触发时,向日志输出的信息以及是否继续运行断点后续代码。 如图所示:
对下图所示代码
可得到如下结果:
Tracepoints输出可使用伪变量名,其映射关系如下:
Pseudo Variable: | Description: |
---|---|
$ADDRESS | Current Instruction |
$CALLER | Previous Function Name |
$CALLSTACK | Call Stack |
$FUNCTION | Current Function Name |
$PID | Process Id |
$PNAME | Process Name |
$TID | Thread Id |
$TNAME | Thread Name |
1.2 性能分析工具
VS2015中的性能测试工具PerTips,在断点调试时以超链接的方式显示于断点处代码行末尾,提示用户自上一断点到当前断点间的时间估值。如下图所示:如需要更多信息请参阅PerTips
1.3 Light Bulbs
VS2015中提供了light bulbs工具用以帮助用户对警告或错误进行快速修复。当VS2015对部分代码在其下方以波浪线标注时,如果用鼠标点击该行或者用鼠标悬浮至波浪线处时,会显示灯泡图标。当用鼠标点击(自测左键或右键点击有效)时,会弹出快速修复提示。可根据提示选项修复可能存在问题的代码。2. 团队协作功能
-
VS2015中可以看到当前文件的修改情况。在当前被打开的文件下方,有两个超链接。如下图所示:
-
上图中左侧超链接是本次文件上次修改时间和修改者名称。点击该超链接后,会以图形化的方式显示此文件总修改次数,每个修改者的修改次数。
-
图git_change_link.png中,蓝色部分的右侧超链接显示当前打开文件的修改者人数和修改次数。点击后会显示此文件的每一次修改的commit message和代码提交时间。
-
双击上图中单个commit后,会在Visual Studio中打开此次提交的详细信息
-
单击涉及到的文件后,会在右侧窗口显示改动细节
-
这样就不用再打开smartgit来比较每次提交的改动了,全部操作都可以在VS2015里完成。此外,为了和正常的文件区分,VS2015将打开的文件前加了diff前缀,如下图所示:
单击Team->Manage Connections可打开Team Explorer窗口并进行相关操作。
3. 可能会影响编译部分的改动
用VS2015打开原工程时,会弹出将platform tools set升级为VS2015(v140)的界面。 我当时选择了升级主工程以及依赖工程。但是在编译阶段,遇到了如下问题:
- fatal error C1189: #error: Macro definition of snprintf conflicts with Standard Library function declaration
经过查阅相关资料,原来是在很多库中,使用了如下定义: #define snprintf _snprintf但是在VS2015中在C99中也定义了snprintf(),因此引发了重复定义。要解决此类错误,可通过如下预编译指令解决:
#if _MSC_VER>=1900
#define STDC99
#else
#ifndef snprintf
#define snprintf _snprintf
#endif
#endif
_MSC_VER相关宏定义如下:
MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)
MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)
MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012)
...... - error LNK2019: unresolved external symbol _imp__fprintf referenced in function
在网上查阅资料得知,是由于VS2015做了如下改动引起:
在之前版本中:
_CRTIMP FILE * __cdecl __iob_func(void);
#define stdin (&__iob_func()[0])
#define stdout (&__iob_func()[1])
#define stderr (&__iob_func()[2])
struct _iobuf {
char *_ptr;
int _cnt;
char _base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char _tmpfname;
};
typedef struct _iobuf FILE;
而在VS2015中:
_ACRTIMP_ALT FILE __cdecl __acrt_iob_func(unsigned);
#define stdin (__acrt_iob_func(0))
#define stdout (__acrt_iob_func(1))
#define stderr (__acrt_iob_func(2))
typedef struct _iobuf
{
void _Placeholder;
} FILE;
解决方案
我找到了一篇微软有关VS2015C++重大改动的文章,有兴趣的同学请参考这里。