C/C++的注意事项

简介:

     最近调试C语言程序,出了一些错误,费了很大的力气才找到这些BUG。现在把这些错误记录下来,同时做一些编程上的原则上的约束,希望能达到两个目的:(1)看到类似的情况,能马上定位知道是什么错误。(2)不在犯这种错误。

         将64位整型转换为32位整型,貌似是没什么问题。但是在做多结点间数据通信的时候,这个不注意的细节将导致很严重的错误。例如在发送端使用的是64位的整型,接收端使用32位整型,这样会导致接收端由于接收缓冲区中的数据没有完全被反序列化阻塞。

        还有使用无符号数的时候一定要注意,因为无符号数减去一个比自身还要大的数,容易出现很严重的问题。原理大家都知道,内部是使用补码存的,但是写程序的时候不一定能注意到。

        使用一些底层的库函数时一定要确保传入的数据类型与接口要求的数据类型一致。我就发生过因为使用zlib的compress函数时要求传入unsigned char * 和 unsigned long int *时,我使用了char *和 unsigned int *时出现一些莫名其妙的错误。

       在使用没有接触的技术或者是底层的库函数的时候,一定要写够测试程序,充分的熟悉接口的使用,而不应该直接集成在软件中,否则会出现很严重的问题。

        使用系统调用或者库函数或者第三方软件的函数时,如果有返回值,一定要检查返回值的情况,以判断程序是否正确。可能就是这样一个小小的问题就会导致导弹打偏或者卫星脱轨,或者是火车站售票系统上常显示的”XXXX位置的内存不能为读“之类的致命错误。如果函数可能会抛出异常,一定要捕获异常。在调试阶段,出现这样问题时,一定要使用exit或者abort之类的方法,强制程序在此结束,并打出当前的行号、文件名称,如果有必要的话还有堆栈信息等这些重要的调试信息。这些对于确定程序出错的位置非常有帮助。   

       养成读文档的好习惯,出现问题的很多一部分原因都是没有仔细阅读文档。文档中详细的说明了接口的使用和注意事项,没有注意到这些细节,调试简直就是自作自受。

       还有常做单元测试,确保缩写的部分代码能够正常运行。然后再集成到软件中,否则出现问题的付出的代价要大的多。



本文转自hipercomer 51CTO博客,原文链接:http://blog.51cto.com/hipercomer/861856


相关文章
|
2月前
|
存储 算法 C语言
【编程陷阱】编写出色C++代码:遵循的注意事项和最佳实践
【编程陷阱】编写出色C++代码:遵循的注意事项和最佳实践
34 0
|
4月前
|
C++
C和C++动态内存分配及内存注意事项(重要)
C和C++动态内存分配及内存注意事项(重要)
33 0
|
6月前
|
Java 程序员 Android开发
C++ 程序员,安卓开发注意事项
C++ 程序员,安卓开发注意事项
|
8月前
|
存储 Linux 编译器
【C++】跨平台开发注意事项【下】
在 Windows 平台上适用的 C++ 代码移植到 Linux 下的注意事项
75 0
【C++】跨平台开发注意事项【下】
|
8月前
|
安全 Linux 编译器
【C++】跨平台开发注意事项【上】
将 Windows 平台上适用 C++ 代码移植到 Linux 下需要注意的事项
281 0
【C++】跨平台开发注意事项【上】
|
10月前
|
算法 安全 C语言
c++的lambda使用注意事项,可能导致的崩溃问题分析
c++的lambda使用注意事项,可能导致的崩溃问题分析
|
12月前
|
存储 IDE 编译器
Android C++系列:函数返回值注意事项
函数返回值就是使用return语句终止正在执行的函数,看是很简单的问题有什么说的呢?因为越是简单的问题里面越是有一些不易发现的坑。
72 0
|
12月前
|
编译器 Android开发 C++
Android C++系列:数组在函数中注意事项
数组作为函数形参传递的是数组首元素的地址本来是很简单的知识点,但是在具体使用中还会有一些坑需要注意。
107 0
|
C++
C++ STL map使用的注意事项记录
map.count与map[]的区别 假如我们建立一个从int到int的映射: 那我们通常会这么写: map<int,int> mp,表示键值的映射 那访问不存在的键与访问存在的键会发生什么呢?
112 0
C++ STL map使用的注意事项记录
C/C++中static局部变量的注意事项
C/C++中static局部变量的注意事项
180 0