一、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