美文网首页
[笔记] “带你玩转VisualStudio”

[笔记] “带你玩转VisualStudio”

作者: CrazyTiger | 来源:发表于2018-03-14 19:55 被阅读0次

文章地址​

文章汇总

工程结构

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定长编码方式。

相关文章

网友评论

      本文标题:[笔记] “带你玩转VisualStudio”

      本文链接:https://www.haomeiwen.com/subject/aokqqftx.html