本文概述
最近在將自己所在的項目升級到VS2015坠非,本文記錄和整理了一些在升級VS2015時自己所查閱的一些VS2015新功能資料敏沉,隨著自己閱讀的不斷延伸,我會持續(xù)更新炎码。這篇日志的主要內(nèi)容如下所示:
- 調(diào)試部分: 將介紹一些有助于調(diào)試的新功能盟迟;
- 團隊協(xié)作部分:主要介紹在VS2015中可以完成的git操作, 可以在VS2015中完成Git flow操作, 下載GitFlow for Visual Studio 2015潦闲;
- 可能會影響編譯部分的改動: 在升級舊工程過程中攒菠,遇到了一些編譯問題,將會把自己遇到的一些問題和相關(guān)解決方案做一些介紹矫钓,希望能對有類似問題的朋友有所幫助要尔。
1. 調(diào)試部分##
1.1 斷點設(shè)置
VS2015引入了斷點設(shè)置功能,當(dāng)鼠標(biāo)懸浮在斷點上時新娜,會出現(xiàn)設(shè)置按鈕和斷點禁用按鈕。![](https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/45/92/metablogapi/5040.clip_image002_thumb_18B4D17F.jpg)
在斷點設(shè)置按鈕中既绩,有如下設(shè)置:
- Conditional statement:使用戶能夠自定義斷點觸發(fā)表達式概龄,只有表達式為true時,觸發(fā)斷點;
- Hit counts:只有當(dāng)斷點觸發(fā)累積到一定次數(shù)后激活饲握;
- Filter:只有當(dāng)觸發(fā)某個進程私杜、線程或MachineID時觸發(fā);
- Tracepoints: 可設(shè)置斷點觸發(fā)時救欧,向日志輸出的信息以及是否繼續(xù)運行斷點后續(xù)代碼衰粹。 如圖所示:
![](https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/45/92/6562.Tracepoint.png)
對下圖所示代碼
![](https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/45/92/4705.4.png)
可得到如下結(jié)果:
![](https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/45/92/8585.5.png)
Tracepoints輸出可使用偽變量名,其映射關(guān)系如下:
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笆怠,在斷點調(diào)試時以超鏈接的方式顯示于斷點處代碼行末尾铝耻,提示用戶自上一斷點到當(dāng)前斷點間的時間估值。如下圖所示:![性能分析工具](https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/45/92/metablogapi/0844.1_PerfTips_thumb_2CFEAB3C.png)
性能分析工具
![](https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/45/92/metablogapi/4657.2_PerfTips_Hover_thumb_6CC891C1.png)
![](https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/45/92/metablogapi/5241.3_DiagToolsWindow_thumb_086D1DB8.png)
![](https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/45/92/metablogapi/5857.3_ReadyToStep_thumb_457922C1.png)
如需要更多信息請參閱PerTips
1.3 Light Bulbs
VS2015中提供了light bulbs工具用以幫助用戶對警告或錯誤進行快速修復(fù)搂漠。當(dāng)VS2015對部分代碼在其下方以波浪線標(biāo)注時,如果用鼠標(biāo)點擊該行或者用鼠標(biāo)懸浮至波浪線處時某弦,會顯示燈泡圖標(biāo)桐汤。當(dāng)用鼠標(biāo)點擊(自測左鍵或右鍵點擊有效)時,會彈出快速修復(fù)提示靶壮〔⑵耄可根據(jù)提示選項修復(fù)可能存在問題的代碼。light_bulbs.png
2. 團隊協(xié)作功能
-
VS2015中可以看到當(dāng)前文件的修改情況安拟。在當(dāng)前被打開的文件下方噪漾,有兩個超鏈接。如下圖所示:git_change_link.png
-
上圖中左側(cè)超鏈接是本次文件上次修改時間和修改者名稱蜂莉。點擊該超鏈接后蜡娶,會以圖形化的方式顯示此文件總修改次數(shù),每個修改者的修改次數(shù)映穗。git_file_commit_graph.png
-
圖git_change_link.png中窖张,藍色部分的右側(cè)超鏈接顯示當(dāng)前打開文件的修改者人數(shù)和修改次數(shù)。點擊后會顯示此文件的每一次修改的commit message和代碼提交時間蚁滋。git_commit_history.png
-
雙擊上圖中單個commit后宿接,會在Visual Studio中打開此次提交的詳細(xì)信息git_commit_detail.png
-
單擊涉及到的文件后,會在右側(cè)窗口顯示改動細(xì)節(jié)git_commit_change_detail.png
-
這樣就不用再打開smartgit來比較每次提交的改動了辕录,全部操作都可以在VS2015里完成睦霎。此外,為了和正常的文件區(qū)分走诞,VS2015將打開的文件前加了diff前綴副女,如下圖所示:git_commit_diff.png
單擊Team->Manage Connections可打開Team Explorer窗口并進行相關(guān)操作。
3. 可能會影響編譯部分的改動
用VS2015打開原工程時蚣旱,會彈出將platform tools set升級為VS2015(v140)的界面碑幅。 我當(dāng)時選擇了升級主工程以及依賴工程。但是在編譯階段塞绿,遇到了如下問題:
- fatal error C1189: #error: Macro definition of snprintf conflicts with Standard Library function declaration
經(jīng)過查閱相關(guān)資料沟涨,原來是在很多庫中,使用了如下定義: #define snprintf _snprintf但是在VS2015中在C99中也定義了snprintf()异吻,因此引發(fā)了重復(fù)定義裹赴。要解決此類錯誤,可通過如下預(yù)編譯指令解決:
#if _MSC_VER>=1900
#define STDC99
#else
#ifndef snprintf
#define snprintf _snprintf
#endif
#endif
_MSC_VER相關(guān)宏定義如下:
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
在網(wǎng)上查閱資料得知,是由于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;
解決方案
我找到了一篇微軟有關(guān)VS2015C++重大改動的文章篮昧,有興趣的同學(xué)請參考這里赋荆。