[工具总结]浅析VS下的调试技巧(下篇)

148 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

前言

        对于一个程序员来说,写代码固然重要,但其实熟悉调试更重要,本文旨在分享一波VS下调试技巧,以提高防范bug、调试纠错的意识与能力。本文是下篇,讲讲易于调试代码及其编写实例。

        笔者水平有限,难免存在纰漏,欢迎指正交流。

如何写出易于调试的代码

优秀的代码应该具备的特点:

  1. 代码运行正常

  2. bug很少

  3. 效率高

  4. 可读性高

  5. 可维护性高

  6. 注释清晰

  7. 文档齐全

常见的coding技巧:

1. 使用assert函数

        assert函数是什么?快戳我让你康康:[深入浅出C语言]assert断言函数简介 - 掘金

2. 尽量使用const

const修饰指针变量的时候:

  1. const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本身的内容可变。

  2. const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。

3. 养成良好的编码风格

        可以参考一些书籍,如《高质量C/C++编程指南》,《修改代码的艺术》等等。

4. 添加必要的注释

5. 避免编码的陷阱。

        可以参考《C陷阱与缺陷》

实例:strcpy函数的模拟实现

strcpy函数是用来干啥的

看看下面这个例子:

image.png

        strcpy对应头文件是<string.h>,是字符串函数,参数是两个字符指针,主要是用来把一个地方的字符串拷贝到另一个地方去。本例中的str2就是源字符串,str1是目标字符串,也就是把str2的"hello world"拷贝到了str1去。

有一个问题:拷贝的时候会把'\0'拷贝过去吗

我们检验一下:

image.png

答案是:会。

接下来我们来模拟实现一下strcpy函数

        像下面这样也仅仅只是完成了函数的功能而已,有没有什么可以进一步优化的地方呢?

image.png

        这样写是不是有点啰嗦?简化一下看看:

image.png

        把拷贝赋值作为循环的判断语句,并且在每次赋值后都让dest和src向后偏移,当*src为'\0'时,作为判断语句进行了*dest = *src,表达式的值就为*src的值也就是'\0'对应ASCII码值为0,为假,退出循环,这时候字符串也拷贝完成了。

        然后我们要考虑一下安全性的问题,万一传给src的是空指针该怎么办?解引用空指针是十分危险的,我们要避免的话可以用前面提到的assert函数。

        假如传了个空指针就会终止程序并报错:

image.png

        当然,也要给dest加一个断言函数。

        到这里为止,这样的代码十分的话也有了八九分,为了防止拷贝对象出错(比如把*dest的内容拷贝到了*src),还需要给src加上const修饰一下(防止被修改):

image.png

        然后返回类型改一下:

image.png

        返回的是目标空间的起始地址,方便实现链式访问。

        在执行完拷贝后dest的指向偏移到后面去了,所以要在一开始拷贝一份dest到ret,最后返回ret。

编程常见的错误

编译型错误

        直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。

链接型错误

        看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不存在或者拼写错误。

运行时错误

        借助调试,逐步定位问题。最难搞。


以上就是本文全部内容,感谢观看,你的支持就是对我最大的鼓励~

src=http___c-ssl.duitang.com_uploads_item_201708_07_20170807082850_kGsQF.thumb.400_0.gif&refer=http___c-ssl.duitang.gif