一个好的coder,他首先必须是一个熟练工。对于C++程序员来说,只有掌握VC的IDE使用方法和技巧,才称得上是“C++”熟练工,让自己工作事半功倍。这里以VC 10.0 为例(VS2010)
对于VC++10来说,最好的代码辅助工具就是番茄插件 Tomato Visual Assitant,用它可以提高查看代码和编写代码的速度。
1.重构(Refactor)
使用重构时,要先将目标代码框选住,然后右键即可。当然也可以从菜单中选(下图)
目前用到的几个:
CreateDeclaration/Implementation:根据cpp实现代码在.h中给出相应声明/根据.h中声明创建.cpp中实现代码
Add Include:自动加上代码需要的头文件
Encapsulate Field:这个相当于Eclipse中的Generate Getters/Setters ,但是这里get和set用的是一个函数名进行这两种方式的重载。Eclipse中多用于创建JavaBeans(Pojo),VC++一样支持类似的做法
ExtractMethod:把一段代码导出成一个函数并对其进行调用。用于大段代码的分割。
Rename:对某个变量重命名
Tomato官网上有详细说明,不过都是英文的
2.自定制IDE和快捷键
这里大部分操作都在“工具->自定义”选项中。“工具栏”选项卡可以随意定制代码上方的工具栏。
“命令”选项卡可自己定制各种弹出菜单。“上下文菜单”主要是用于控制鼠标右键弹出的菜单。想添加的话点“添加命令”去找就是了
右下方“键盘”按钮用于控制各种快捷键。有些用着不是很方便的可以对其进行修改。如删除某行的命令,系统默认是“Ctrl+Shift+L”,不仅按起来麻烦,还可能和切换输入法冲突。我将其改成了“Ctrl+D”(Eclipse里面是这样的),效率高多了
其它常用命令:Alt+G——转到定义(如果是宏的话还是直接F12比较好)
3.各种插件的使用
VS中使用“插件管理器”进行控制。有经验的人会使用各种插件提高他们的效率
除了番茄插件是必备的利器外,值得一提的是IndentGuides,这个插件可以用虚线匹配大括号,在逻辑代码非常多时可以使你的代码看起来更清晰
另外著名的插件有Incredibuild,不过这个貌似只有VS2005有完全的联合编译工具,用起来非常爽,可以提高代码的编译速度(编译是会呼吸的痛啊......)
4.调试
主要快捷键:
F5(加断点时用)F7(跳出一层)F10(逐过程)F11(逐语句,和F7配合)
除了要会用这些外,对于一个C++程序员来说,更重要的是查看内存。
非常遗憾的是,这里仍有一些不够了解的地方。如反汇编和寄存器等,需要对汇编有一定的了解
调出内存模块,把变量地址粘贴到内存窗口上,可以查看这个内存对应的值情况:
如果变量包含汉字会看到“乱码”,不用怕,这是因为VS默认采用GB2312对汉字进行解码,但是却没有体现在内存窗口上的原因。这里只能解析ANSI字符。我们只需把其对应的编码按照GB2312映射表进行对照就可以找出对应的汉字了
另一个常用的窗口是“调用堆栈”,可以查看当前断点执行语句的调用关系,这里不多介绍了
大家看代码时常常会用断点跟进的办法对其进行追踪,以便了解它的执行过程,对于一段陌生的代码而言更是如此。以前每次加完断点后不用就丢弃了,以后想查看上次的追踪过程,就找不到了。解决办法是将加过的断点导出来保存之,以便日后查看。
对于引用了外部库的代码,如果想进行断点跟进,必须保证外部模块代码构建时生成了调试信息。建每个工程时这个都被设为了默认选项(“项目属性页->链接器->调试->生成调试信息”),生成.lib、.dll、.exe时,会生成相应的.pdb文件,如果没有这些.pdb文件,就没法在调试过程中进到相应的代码中去。
有时会出现虽然找得到对应模块.pdb文件,但是仍然无法断点跟进的情况,别急,我们选择“调试->窗口->模块”,调出“模块”窗口,哪些模块调试信息加载了哪些没加载自然一目了然了:
其中“符号状态”显示了对应模块是否被加载。如果某个模块显示的是“Cannot find...”,那么我们可以手动为其配置路径
这样就可以对该模块进行断点跟进了
另外要说明的是,即使这些都做了,有时仍然会出现断点进不去的现象。这时应检查工程加载的.lib和.dll版本是否一致,一次编译生成的对应.lib和.dll才是对应一致的版本。否则会找不到调试信息
5.查看和分析编译信息
学会分析编译信息是一个能充分体现“经验”的地方:因为很多编译错误往往指向的不是错误本身发生的地方,很多时候提示信息往往莫名其妙。这时就需要程序员有一定的经验,来排除错误可能发生的原因。譬如你的class结尾没有加“;”,那么编译器可能不会告诉你少加了“;”,而是提示你一个看似不相关的信息,让你晕头转向,呵呵(这是我曾经遇到的一个问题)。再如STL相关的编译错误提示,等等
另一个需要说明的地方是:很多时候我们习惯了使用现成的东西,而不愿去追究它的细节。在问题比较繁重的时候,我们会忽略一些问题,减轻我们的负担,但是如果你有富裕的时间,静下心来钻研一下,是很有收获的,而且我相信不是每个程序员都愿意这么做。
一个比较让我印象深刻的例子是:在我把一个以前编译好的工程,转移到另一台机器上时,编译环境发生变化,而我的VS也不能正确编译了。最后是改了两个地方:一个是修改了全部的路径(建议在一开始编译的时候,用相对路径“../”,不要用绝对路径。而且这里要使用一些诸如NotePad++这样的工具,不然会累死的……),另一个是修改了编译器所在路径……Visual Studio为我们做了太多太多,以至于我们不清楚编译的具体过程。当你使用过Linux后,你就会明白,用Visual Studio开发Windows程序是非常幸福的。
解决第二个问题的途径是这样的:打开 “工具”→“选项”→“项目和解决方案”→“生成并运行”→“MS Build项目生成输出详细信息”,修改输出级别为“详细”,这时发现了编译器 cmake.exe 的路径错误,于是我用NotePad++打开了所有.vcxproj文件,替换了所有路径,重新打开,编译通过。
观察你的编译提示信息,即使对于警告也不要轻易放过,因为警告也可能导致一些严重的运行时错误。如“代码936...”这样的问题(往往是由于文件的代码页不正确,用UE等工具把格式修改为VS所能识别的文字编码格式就好了,或者直接在VS中创建新文件)
可在“项目”→“属性”→“配置属性”→“C/C++”→“常规”中,自己调整警告级别,或是将警告视作错误