[笔记] “带你玩转VisualStudio”

文章地址​

文章汇总

工程结构

External Dependencies
工程的外部依赖文件,这个目录是VS自动生成的,你最好别动它。

Header Files
头文件,也就是.h(.hpp)后缀的头文件。

Source Files
源文件,也就.cpp(或.c,针对C语言)后缀的文件。

Resource Files
资源文件,如果你创建的是MFC的工程,*.rc文件就会在这里。

VA助手快捷键

Alt+G 快速跳转,如由声明跳转到实现,由实现跳转到声明。 光标要在标识符处
Alt+O .h与.cpp文件的快速切换
Alt+Shift+F 查找标识符所有被引用的位置 光标要在标识符处
Alt+Shift+O 查找整个Solution下的某个文件 O指open,打开指定的文件
Alt+Shift+S 查找标识符 S指Symbol
Alt+Shift+R 重命名标识符 光标要在标识符处,R指ReName
Ctrl+Shift+V 选择剪切板的内容进行粘贴

SVN

VisualSVN是一个VS插件,依赖于SVN,使用插件的话,同时也要按照SVN。
VisualSVN的官方下载地址
SVN的官方下载地址

需要上传的文件类型

h: 头文件 
cpp: 源文件 
txt: 说明文件,如readme 
rc: 资源文件 
rc2: 资源文件 
ico: 图标,如logo等 
sln: 解决方案工程文件 
vcxproj: 工程文件 
filters: 文件过虑器

不要上传的文件类型

Debug、Release等编译结构目录 
ipch目录 
aps: last resource editor state 
exe: build result 
idb: build state 
ipch: build helper 
lastbuildstate: build helper 
lib: build result. Can be 3rd party 
log: build log 
manifest: build helper. Can be written yourself. 
obj: build helper 
pch: build helper 
pdb: build result 
res: build helper 
sdf: intellisense dbase 
suo: solution user options 
tlog: build log 
user: debug settings. Do preserve if just one dev or custom debug settings

预编译头

如果你的工程选用了预编译头文件的方式,每一个.cpp文件的第一行代码必须包含预编译头文件(#include “stdafx.h”),否则会编译出错。

预编译技术的内存原理

在Windows程序开发时,经常要在各个文件中包含windows.h、afx.h等标准头文件,而这些文件非常的大,在编译时就非常的慢,非常耗时。为解决这个问题,已是就有了预编译头文件的技术。

所谓头文件预编译技术,就是把一个工程(Project)中常用的一些头文件(如标准头文件Windows.h、Afxwin.h等,也可以是自己定义的头文件)包含在stdafx.h中,并对stdafx.h预先编译(在所有的.cpp文件编译之前进行编译),得到编译结果.pch文件(默认名称为ProjectName.pch),后期该工程在编译其它.cpp文件时不再编译stdafx.h中的内容(即使include了它),仅仅使用预编译的结果。
其中stdafx.h叫做预编译头文件,stdafx名称的英文全称为:Standard Application Framework Extensions,当然你也可以自己定义预编译头文件的名称,手动重命名stdafx.h,同时将上面图2和图3中对应的名称也得改过来。ProjectName.pch叫做预编译头。

采用预编译头技术后,可以加快编译速度,节省编译时间。因为只需要预先编译一次就可以在所有的.cpp编译时使用,不用再次编译。这样带来的一个问题就是每一个.cpp文件的开头都要包含预编译头文件#include “stdafx.h”。因为预编译头技术是假定预编译头中的内容会在所有.cpp文件中使用,在编译你的 .cpp 的时候,就会将预编译头中已经编译完的部分加载到内存中。

使用预编译头文件需要注意的几个要点:

  1. 你编写的任何.cpp文件都必须首先包含stdafx.h。
  2. 如果你有工程文件里的大多数.cpp文件需要的.h文件,顺便将它们加在stdafx.h(后部)上,然后预编译stdafx.cpp。
  3. 由于.pch文件具有大量的符号信息,它是你的工程文件里最大的文件。

非MFC工程中使用MFC库

貌似会很有用,现存起来,以后用到再说。
非MFC工程中使用MFC库

Runtime Library

单线程库
多线程是必要的,单线程的两个库早就弃用了。

多线程lib库
一个解决方案可能包含多个项目,如果每个项目都使用lib运行库,那么会冲突。
项目也会依赖项目,这两个项目如果都使用lib运行库,那么也会冲突。

结论
Release和Debug分别使用:MD(多线程DLL库)和MDd(Debug多线程DLL库),其他的都不用。

多字节编码与Unicode码

1.Character Set

Configuration Properties -> General -> Character Set
当设置为Use Unicode Character Set时,会有预编译宏:_UNICODE、UNICODE
当设置为Use Multi-Byte Character Set时,会有预编译宏:_MBCS

2. 不同Character Set,参数类型不同

WINUSERAPI
int
WINAPI
MessageBoxA(
    __in_opt HWND hWnd,
    __in_opt LPCSTR lpText,
    __in_opt LPCSTR lpCaption,
    __in UINT uType);
WINUSERAPI
int
WINAPI
MessageBoxW(
    __in_opt HWND hWnd,
    __in_opt LPCWSTR lpText,
    __in_opt LPCWSTR lpCaption,
    __in UINT uType);
#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA
#endif // !UNICODE
类型 MBCS UNICODE
WCHAR wchar_t wchar_t
LPSTR char* char*
LPCSTR const char* const char*
LPWSTR wchar_t* wchar_t*
LPCWSTR const wchar_t* const wchar_t*
TCHAR char wchar_t
LPTSTR TCHAR(或char) TCHAR* (或wchar_t*)
LPCTSTR const TCHAR* const TCHAR*

3.不同Character Set,编码方式不同

上面的Multi-Byte Character Set一般是指ANSI(多字节)字符集。而Unicode Character Set就是Unicode字符集,一般是指UTF-16编码的Unicode。也就是说每个字符编码为两个字节,两个字节可以表示65535个字符,65535个字符可以表示世界上大部分的语言。

一般推荐使用Unicode的方式,因为它可以适应各个国家语言,在进行软件国际时将会非常便得。除非在对存储要求非常高的时候,或要兼容C的代码时,我们才会使用多字节的方式 。

4.在C++代码中定义不同编码方式的字符串

  1. 用常量字符给wchar_t变量赋值时,前面要加L。如: wchar_t wch2 = L’中’;
  2. 用常量字符串给wchar_t数组赋值时,前面要加L。如: wchar_t wstr2[3] = L”中国”;
  3. 如果不加L,对于英文可以正常,但对于非英文(如中文)会出错。

5.理解_T()、_Text()宏即L”“

查看tchar.h头文件的定义我们知道_T和_TEXT的功能是一样的,是一个预定义的宏。

#define _T(x)       __T(x)
#define _TEXT(x)    __T(x)

再看看__T(x)的定义,发现它有两个:

#ifdef  _UNICODE
// ... 省略其它代码
#define __T(x)      L ## x
// ... 省略其它代码
#else   /* ndef _UNICODE */
// ... 省略其它代码
#define __T(x)      x
// ... 省略其它代码
#endif  /* _UNICODE */

当我们的工程的Character Set设置为Use Unicode Character Set时_T和_TEXT就会在常量字符串前面加L,否则(即Use Multi-Byte Character Set时)就会以一般的字符串处理。

6.总结一下

UNICODE宏和MBCS,对很多函数和宏有影响。
char* 也可以表示中文,wchar_t*也可以表示中文,只不过编码方式不同,一个是ANSI(多字节)字符集,一个是Unicode字符集。具体到编码方式,前者可能是变长的编码方式,后者应该是UTF16定长编码方式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352