C++:VS2017基本操作、番茄助手的重构功能以及C++的项目工程基本配置

一、VS2017 IDE环境基本配置

窗口布局:在视图中选择“类视图”、“资源视图”、“解决方案资源管理器”、“输出窗口”,以及番茄助手提供的“VAOutline”。好用的插件有一下几个:

1、VS2017上使用番茄助手的说明:https://blog.csdn.net/xzytl60937234/article/details/70455777

番茄助手下载地址[亲测能用]:https://download.csdn.net/download/dashumak/10680707

其中,新版的番茄助手添加了重构功能Refactor,真的无比强大,让人欲罢不能。首先看一下位置

具体介绍:

  • add include:添加头文件,当编译后提示“未定义类型”时直接右键类型名,refactor→add include。
  • create implementation:添加实现,当在头文件中声明好方法后,想到cpp里写实现,直接贴过去,是可以但还是要做部分修改。同样是右键该方法,refactor→create implementation。
  • create declaration :添加声明,create implementation的逆过程,如果你习惯先写实现再声明的话,用这个很方便。
  • document method:方法说明,用这个可以在方法上面写上该方法的作用域,参数,返回值等主要信息,一目了然
  • move implementation to source file:移动实现到头文件。把不该内联的复杂函数实现写到头文件里了?没关系,直接refactor→cmove implementation to source file自动移动到cpp文件中
  • rename:重命名,发现自己之前写的代码命名(变量名,函数名,包括类名。。)不规范,又不想一个个改?refactor→rename自动把所有相关的部分改过来,包括注释(可选)。值得注意的是这个不是直接简单的查找替换,番茄助手会只改涉及到该类或者该类继承类的变量,而不会改其他的同名变量。(找了很久这个功能,终于让我等到了o(╥﹏╥)o)
  • encapsulate field:变量封装,写了个private的成员变量,发现外面要用到,直接就移到public里面来?太容易妥协了吧,也不满足C++封装的原则。同样右键refactor→encapsulate field。set,get一次搞掂
  • changs signature:改变签名(不知如何翻译),rename的加强版,如果不只是名字改了,返回值类型甚至参数表都改了,怎么办,重写?不用,va的changs signature照样可以一次性解决。

2、Astyle插件(从VS2017的扩展中即可直接安装)

将我的设置列于下

–style=kr –indent=spaces=4 –align-pointer=name –align-reference=name –pad-oper –pad-header –keep-one-line-statements –convert-tabs –mode=c

对应的对话框选择如下

3、VSCode快捷键

因为以前VC6.0的工程常用VS Code进行编辑,因此将VS2017的快捷方式也改成VSCode的方式:进入键盘->“应用一下其他键盘映射方案”选择"Visual Studio Code"。此模式下,常用的VS2017快捷键如下

快捷键 效果
CTR+, 启动上图所示的设置画面
CTR+K,CTR+O c/cpp文件切换
CTR+F 搜索
CTR+鼠标滚轮 字体方法/缩小
CTR+K,CTR+C 单行注释
CTR+K,CTR+U 取消单行注释
CTR+W 关闭当前窗口
CTR+K+W 关闭所用窗口
CTR+K+0/J 完全折叠/展开代码
F12 找到定义
ALT+F12 不跳转打开定义
ALT+方向键左键/右键 到上一次/下一次光标
选中代码按tab键 代码向右缩进
选中代码按shift+tab键 代码向左缩进
CTR+SHIFT+{,CTR+SHIFT+} 快速定位到另一半括号

还有几个调试很好用的快捷键

按键 效果
F5 启动调试/调试时继续运行直到遇到下一个断点
CTR+F7 编译
F9 插入断点/清除断点(VS2017断点可以设置条件很方便)
F10 单步前进,但遇到函数不会进入
F11 单步前进,遇到函数会进入
Shift+F11 前进直到当前函数返回

4、折叠代码专用宏

当代码很长,我们希望将实现某一段实现具体功能的代码折叠起来,可以使用下面的宏

#pragma region 用户登录,要求输入用户名和密码,三次输入错误则关闭程序
...//登陆功能具体代码
#pragma endregion

代码折叠后效果如下

5、调出控制台

5.1. printf直接打印

以MFC程序为例,进入APP类的Initlnstance()函数,在函数末尾,retrun之前,加入以下代码

AllocConsole( ); //创建一个控制台窗口
freopen("CONOUT$", "w", stdout);

使用freopen()函数的好处就是在需要打印信息的时候,不需要获得控制台的句柄,直接输出信息就好。之后在需要打印信息的地方打印即可(可以是整个程序任何地方),最好用printf函数即可,这样也不需要额外的头文件了。如下

printf("%d",500);

5.2.指定句柄打印

如果调用的第三方库的函数也有printf函数,而且想要控制台上只显示我们想要打印的数据的时候,就需要指定控制台的句柄,加入函数的位置同样是在Initlnstance()函数里边

    AllocConsole(); //创建一个控制台窗口HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出句柄

打印的语句是

    CString msg = "Hellon";WriteConsole(hOutput, msg, strlen(msg), NULL, NULL);//向控制台窗口写入信息

但是如果想在其他地方使用句柄hOutput,就需要将其设成全局变量了。如果想要换行,只需要在内容中加入“n”就可以了

6、删除代码中的所有空格

在替换窗口中选择“正则表达式”,输入“^s*(?=r?$)n”,替换为空就行了

二、C++的项目工程基础配置(路径配置、各种生成文件说明以及路径宏定义说明)

1、添加头文件所在的目录

依次打开“项目——属性——配置属性——C++——常规——附加包含目录”中加入所有的路径。 需要注意的是: 
(1)路径必须指向头文件所在的子文件夹,而不能直到父文件夹就结束 
(2)每个路径不需要加上双引号,输入了之后,vs2008会自动加上双引号,如果自己加可能vs2008无法识别双引号 
(3)如果是多个路径,路径直接用“;”隔开。

2、添加库(libs)文件目录和lib文件名

除了头文件以外,也需要告诉编译器,类在哪里实现的,即封装类的链接库在哪里,这样程序才能执行工具包中的函数。首先需要将链接库的路径输入vs2008,即添加库(libs)文件目录。具体步骤:

(1)依次打开“项目——属性——配置属性——链接器——常规——附加库目录”中加入链接库的路径。 
(2)添加所需“库文件”名称,即添加编译所需要(依赖)的 lib 文件 。在“项目——属性——配置属性——链接器——常规——输入——附加依赖项”中加入链接库的名字,多个lib用空格隔开。

发现一个很奇怪的现象,当.c/.cpp所在文件夹A下有*.lib,填入的附加库目录B也有*.lib,那么编译的时候会优先选择A下的*.lib。所以如果编译的时候出现第三库链接的一些问题,一定要确保程序链接的是正确的*.lib文件

3、配置输出路径和目标文件名、中间目录

(1)配置输出路径(生成的exe或dl的路径,同时ilk文件也会生成到此):依次打开“项目——属性——配置属性——常规——输出目录”。添加需要输出的目录,记得一定是以“”结尾。

(2)如果是生成库文件的项目,还需指定lib文件的生成路径:

(3)目标文件名也要在这里修改,字符集改成“使用多字节字符集”也在这个界面。

(4)中间目录也在此页,生成的obj文件,预编译头,预编译相关的idb及pdb,buildlog都会在这里。idb 是系统生的成的状态信息,可以加速随后的编译,pdb 包含调试信息

4、其他文件

(1)Linker->Debugging->Genrerate Program Database File,输出的pdb文件

(2)Linker->Advanced->Import Library 指示了将随同dll生成的lib文件输出的文件名和路径

(3)配置属性->浏览信息->所有选项中的“输出文件”,指示了.bsc文件输出的文件名和路径

5、生成的各种文件说明

(1)DSW:全称是Developer   Studio   Workspace,最高级别的配置文件,记录了整个工作空间的配置信息,她是一个纯文本的文件,在vc创建新项目的时候自动生成   

(2)DSP:全称是Developer   Studio   Project,也是一个配置文件,不过她记录的是一个项目的所有配置信息,纯文本文件   

(3)OPT:与DSW、DSP配合使用的配置文件,她记录了与机器硬件有关的信息,同一个项目在不同的机器上的opt文件内容是不同的   

(4)CLW:记录了跟ClassWizard相关的信息,如果丢失了clw文件,那么在Class   View面板里就没有类信息   

(5)PLG:实际上是一个超文本文件,可以用Internet   Explorer打开,记录了Build的过程,是一个日志型文件   

(6)RC:资源描述文件,记录了所有的资源信息,在资源编辑器里作的修改,实际上都是对RC文件的修改   

(7)RC2:附加的资源描述文件,不能直接资源编辑器修改,只能手工添加,可以用来添加额外的资源   

(8)RES:经过资源编辑器编译之后的资源文件,以二进制方式存放   

(9)SBR:编译器生成的浏览信息文件,在代码导航的时候非常有用,她需要在编译时指定/FR或者/Fr开关   

(10)BSC:BSCMAKE.EXE将所有的SBR文件作为输入,经过处理之后输出一个BSC文件,在代码导航的时候实际用到的是BSC文件   

(11)ILK:当选定渐增型编译连接时,连接器自动生成ILK文件,记录连接信息   

(12)PDB:全称是Program   DataBase,即程序数据库文件,用来记录调试信息,是一个相当重要的文件,没有他,程序无法正常调试   

(13)LIB:如果项目输出是Dll的话,一般会输出一个跟项目同名的Lib文件,记录输出的函数信息   

(14)EXP:同Lib,是跟Dll一起生成的输出文件   

(15)PCH:全称是PreCompiled   Header,就是预先编译好的头文件,在编译时指定/Yu开关时编译器自动生成

6、文件路径常用的宏

为了项目的移植,推荐使用相对路径。VS提供了很对的路径宏来代表示相对路径。常用的如下

     
$(ProjectDir) 即项目文件(vcxproj)所在的根目录
$(IntDir) 指定的中间文件路径  
$(OutDir) 指定的输出目录
$(SolutionDir) 解决方案(.sln)所在的根目录  
$(SolutionPath) 解决方案(.sln)的绝对路径名(定义形式:驱动器 + 路径 + 基本名称 + 文件扩展名)
$(SolutionName) 解决方案的基本名称  
$(SolutionPath).. 解决方案的上一级 E:Top7PlusAll

可以用“..”两个点跳到上一级目录

可以通过如下方式查看路径宏在本机对应的绝对路径

 

7、最后讲一下试用第三方库时文件的配置说明

https://blog.csdn.net/raodotcong/article/details/8998379

Published by

风君子

独自遨游何稽首 揭天掀地慰生平