持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
前言
对于一个程序员来说,写代码固然重要,但其实熟悉调试更重要,本文旨在分享一波VS下调试技巧,以提高防范bug、调试纠错的意识与能力。本文是下篇,讲讲易于调试代码及其编写实例。
笔者水平有限,难免存在纰漏,欢迎指正交流。
如何写出易于调试的代码
优秀的代码应该具备的特点:
代码运行正常
bug很少
效率高
可读性高
可维护性高
注释清晰
文档齐全
常见的coding技巧:
1. 使用assert函数
assert函数是什么?快戳我让你康康:[深入浅出C语言]assert断言函数简介 - 掘金
2. 尽量使用const
const修饰指针变量的时候:
const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本身的内容可变。
const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。
3. 养成良好的编码风格
可以参考一些书籍,如《高质量C/C++编程指南》,《修改代码的艺术》等等。
4. 添加必要的注释
5. 避免编码的陷阱。
可以参考《C陷阱与缺陷》
实例:strcpy函数的模拟实现
strcpy函数是用来干啥的
看看下面这个例子:
strcpy对应头文件是<string.h>,是字符串函数,参数是两个字符指针,主要是用来把一个地方的字符串拷贝到另一个地方去。本例中的str2就是源字符串,str1是目标字符串,也就是把str2的"hello world"拷贝到了str1去。
有一个问题:拷贝的时候会把'\0'拷贝过去吗
我们检验一下:
答案是:会。
接下来我们来模拟实现一下strcpy函数
像下面这样也仅仅只是完成了函数的功能而已,有没有什么可以进一步优化的地方呢?
这样写是不是有点啰嗦?简化一下看看:
把拷贝赋值作为循环的判断语句,并且在每次赋值后都让dest和src向后偏移,当
*src为'\0'时,作为判断语句进行了*dest = *src,表达式的值就为*src的值也就是'\0'对应ASCII码值为0,为假,退出循环,这时候字符串也拷贝完成了。
然后我们要考虑一下安全性的问题,万一传给src的是空指针该怎么办?解引用空指针是十分危险的,我们要避免的话可以用前面提到的assert函数。
假如传了个空指针就会终止程序并报错:
当然,也要给dest加一个断言函数。
到这里为止,这样的代码十分的话也有了八九分,为了防止拷贝对象出错(比如把
*dest的内容拷贝到了*src),还需要给src加上const修饰一下(防止被修改):
然后返回类型改一下:
返回的是目标空间的起始地址,方便实现链式访问。
在执行完拷贝后dest的指向偏移到后面去了,所以要在一开始拷贝一份dest到ret,最后返回ret。
编程常见的错误
编译型错误
直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。
链接型错误
看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不存在或者拼写错误。
运行时错误
借助调试,逐步定位问题。最难搞。
以上就是本文全部内容,感谢观看,你的支持就是对我最大的鼓励~