前言IT公司每年都会有一定的人员流动相应地也会招一些应届生补充进来指导应届生已经成为老员工的必修课了。平日里会我们会经常帮新人排查代码中的问题在此过程中发现了C新手容易犯的一些编程错误在此简单的总结一下给新人们提供一个参考。1、有些关键字在cpp文件中多写了对于C类一些关键字只要写在.h中就好cpp中就不用再加上了比如virtual、static等关键字如果再cpp中多写编译器会报错。比如如下的虚接口与静态成员变量的定义只要在头文件中声明就可以了。123456classshape{virtualDraw();//...staticintnLevel;}2、函数参数的默认值写到函数实现中了带有参数默认值的函数默认值是加在函数声明处的函数实现处的参数是不需要带上的。为了方便查看代码在函数实现处的参数中将默认值注释起来。正确的做法是头文件中有默认值1BOOLCreateConf(constCString strConfName,constBOOLbAudio FALSE );在函数实现处的参数中不用添加默认值1234BOOLCreateConf(constCString strConfName,constBOOLbAudio/* FALSE*/);{// ......}3、在编写类的时候在类的结尾处忘记添加;分号了在类的结尾处忘记添加分号编译会报错新人们有可能找了半天也没找出引起编译错误的原因。其实很简单在类的结尾处忘记添加分号了。1234classShape{// ...};4、只添加了函数声明没有函数实现在添加类的函数时只在类的头文件中添加了函数声明但在cpp中却没有添加函数的实现。如果其他地方调用到该函数在编译链接的时候会报 unresolved external symbol错误。因为没有实现所有没有供链接使用的obj文件。5、cpp文件忘记添加到工程中导致没有生成供链接使用的obj文件在添加C类时我们一般会添加.h头文件和一个.cpp源文件。结果忘记把.cpp文件添加到工程中了即没有参与编译没有生成供链接使用的obj文件。如果有代码调用到该C类的接口则在编译链接的时候会报 unresolved external symbol错误即链接不到该C类对应的接口。6、函数中返回了一个局部变量的地址或者引用在函数中返回了一个局部变量的地址或者引用而这个局部变量在函数结束时其生命周期就结束了内存就被释放了。当外部访问到该变量的内存会触发内存访问违例的异常因为该变量的内存已经释放了。比如如下的错误代码12345678char* GetResult(){charchResult[100] { 0 };// ......returnchResult;}7、忘记将父类中的接口声明virtual函数导致多态没有生效代码中本来要借助于C多态的虚函数调用调用子类实现的接口结果忘记在父类中将对应的接口声明为virtual导致没有调用到子类实现的函数。一定要记住要实现多态下的函数调用父类的相关接口必须声明为virtual。12345678classShape(){// ...virtualvoidDraw();// ...}8、该使用双指针的地方却使用了单指针有时我们需要调用一个接口去获取某些数据接口中将数据拷贝到传入的参数对应的内存中此时设计参数时会传入指针或引用。我们在调用GetData之前定义了结构体指针p并new出了对应的结构体对象内存应该在定义GetData接口时应该使用双指针指针的指针的结果错写成了单指针。有问题的代码如下1234567891011121314151617structCodecInfo// 编码信息{intnFrameRate// ...}CodecInfo* pInfo newCodecInfo;GetAudioCodecPtr()-GetCodecInfo(pInfo);// 调用AudioCodec::GetCodecInfo获取编码信息AudioCodec::GetCodecInfo( CodecInfo* pInfo)// 此处的参数不应该使用单指针{memcpy(pInfo, m_codecInfo,sizeof(CodecInfo));}上图中的AudioCodec::GetCodecInfo接口的参数不应该为单指针应该用双指针修改后的代码应该如下1234AudioCodec::GetCodecInfo( CodecInfo** pInfo)// 此处的参数类型使用双指针{memcpy(*pInfo, m_codecInfo,sizeof(CodecInfo));}9、发布exe程序时忘记将exe依赖的C运行时库和MFC库带上比如新人用VS-MFC库编写一个测试用的工具软件结果在发布release版本程序时没有将程序依赖的C运行时库带上导致该工具软件在某些电脑中启动报错提示找不到C运行时库因为程序中依赖了动态版本的运行时库和MFC库在发布程序时要将这些库带上。有些系统中没有这些库程序启动时就会报找不到库就会启动失败。10、应该使用深拷贝却使用了浅拷贝本来应该要进行深拷贝的却使用了浅拷贝直接赋值导致另个不同生命周期的C对象指向了同一块内存一个对象将内存释放后另一个对象再用到这块内存就造成了内存访问违例产生异常。