0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简单总结一下嵌入式C++中常见的错误形式

嵌入式开发爱好者 来源:嵌入式开发爱好者 2024-02-23 09:40 次阅读

1、有些关键字在 cpp 文件中多写了

对于 C++ 类,一些关键字只要写在 .h 中就好,cpp 中就不用再加上了,比如 virtual、static 等关键字,如果在 cpp 中多写,编译器会报错。

比如如下的虚接口与静态成员变量的定义,只要在头文件中声明就可以了。

classshape
{
virtualDraw();
//...
staticintnLevel;
}

2、函数参数的默认值写到函数实现中了

带有参数默认值的函数,默认值是加在函数声明处的,函数实现处的参数是不需要带上的。

为了方便查看代码,在函数实现处的参数中,将默认值注释起来。正确的做法是,头文件中有默认值:

BOOLCreateConf(constCString&strConfName,constBOOLbAudio=FALSE);
在函数实现处的参数中不用添加默认值:
BOOLCreateConf(constCString&strConfName,constBOOLbAudio/*=FALSE*/);
{
//......
}

3、在编写类的时候,在类的结尾处忘记添加 ";" 分号了

在类的结尾处忘记添加分号,编译会报错,新人们有可能找了半天也没找出引起编译错误的原因。

其实很简单,在类的结尾处忘记添加分号了。

classShape
{
//...
};

4、只添加了函数声明,没有函数实现

在添加类的函数时,只在类的头文件中添加了函数声明,但在 cpp 中却没有添加函数的实现。

如果其他地方调用到该函数,在编译链接的时候会报unresolved external symbol错误。因为没有实现,所有没有供链接使用的 obj 文件。

5、cpp 文件忘记添加到工程中,导致没有生成供链接使用的 obj 文件

在添加 C++ 类时,我们一般会添加 .h 头文件和一个 .cpp 源文件。结果忘记把 .cpp 文件添加到工程中了,即没有参与编译,没有生成供链接使用的 obj 文件。

如果有代码调用到该 C++ 类的接口,则在编译链接的时候会报unresolved external symbol错误,即链接不到该 C++ 类对应的接口。

6、函数中返回了一个局部变量的地址或者引用

在函数中返回了一个局部变量的地址或者引用,而这个局部变量在函数结束时其生命周期就结束了,内存就被释放了。

当外部访问到该变量的内存,会触发内存访问违例的异常,因为该变量的内存已经释放了。比如如下的错误代码:

char*GetResult()
{
charchResult[100]={0};

//......

returnchResult;
}

7、忘记将父类中的接口声明 virtual 函数,导致多态没有生效

代码中本来要借助于 C++ 多态的虚函数调用,调用子类实现的接口,结果忘记在父类中将对应的接口声明为 virtual,导致没有调用到子类实现的函数。

一定要记住,要实现多态下的函数调用,父类的相关接口必须声明为 virtual。

classShape()
{
//...

virtualvoidDraw();

//...
}

8、该使用双指针的地方,却使用了单指针

有时我们需要调用一个接口去获取某些数据,接口中将数据拷贝到传入的参数对应的内存中,此时设计参数时会传入指针或引用。

我们在调用GetData 之前定义了结构体指针p,并 new 出了对应的结构体对象内存,应该在定义 GetData 接口时应该使用双指针(指针的指针)的,结果错写成了单指针。

有问题的代码如下:

structCodecInfo//编码信息
{
 int nFrameRate;

//...
}


CodecInfo*pInfo=newCodecInfo;

GetAudioCodecPtr()->GetCodecInfo(pInfo);//调用AudioCodec::GetCodecInfo获取编码信息


AudioCodec::GetCodecInfo(CodecInfo*pInfo)//此处的参数不应该使用单指针
{
memcpy(pInfo,m_codecInfo,sizeof(CodecInfo));
}

上面中的AudioCodec::GetCodecInfo接口的参数不应该为单指针,应该用双指针,修改后的代码应该如下:

AudioCodec::GetCodecInfo(CodecInfo**pInfo)//此处的参数类型使用双指针
{
memcpy(*pInfo,m_codecInfo,sizeof(CodecInfo));
}

9、发布 exe 程序时,忘记将 exe 依赖的 C 运行时库和 MFC 库带上

比如新人用 VS-MFC 库编写一个测试用的工具软件,结果在发布 release 版本程序时,没有将程序依赖的 C 运行时库带上,导致该工具软件在某些电脑中启动报错,提示找不到 C 运行时库:

因为程序中依赖了动态版本的运行时库和 MFC 库,在发布程序时要将这些库带上。有些系统中没有这些库,程序启动时就会报找不到库,就会启动失败。

10、应该使用深拷贝,却使用了浅拷贝

本来应该要进行深拷贝的,却使用了浅拷贝(直接赋值),导致另个不同生命周期的 C++ 对象指向了同一块内存,一个对象将内存释放后,另一个对象再用到这块内存,就造成了内存访问违例,产生异常。

有个经典的 C++ 笔试题,让我们实现 String 类的相关函数,其主要目的就是用来考察对深拷贝与浅拷贝的理解的。题目中给出String类的声明:

classString{
public:
String();
String(constString&str);
String(constchar*str);
String&operator=(Stringstr);
char*c_str()const;
~String();
intsize()const;
private:
char*data;
};

让写出上述几个函数的内部实现。这些函数的实现代码如下:

//普通构造函数
String::String(constchar*str)
{
if(str==NULL)
{
 m_data = new char[1];//得分点:对空字符串自动申请存放结束标志'�'的,加分点:对m_data加NULL判断
*m_data='�';
}
else
{
intlength=strlen(str);
m_data=newchar[length+1];//若能加NULL判断则更好
strcpy(m_data,str);
}
}


//String的析构函数
String::~String(void)
{
delete[]m_data;//或deletem_data;
}


//拷贝构造函数
String::String(const String &other)//得分点:输入参数为const型
{
intlength=strlen(other.m_data);
m_data=newchar[length+1];//若能加NULL判断则更好
strcpy(m_data,other.m_data);
}


//赋值函数
String & String::operator =(const String &other)//得分点:输入参数为const型
{
if(this ==&other)//得分点:检查自赋值
return*this;
if(m_data)
 delete[] m_data;//得分点:释放原有的内存资源
intlength=strlen(other.m_data);
 m_data = new char[length + 1];//加分点:对m_data加NULL判断
strcpy(m_data,other.m_data);
return*this;//得分点:返回本对象的引用
}





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5068

    文章

    19008

    浏览量

    302929
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28327
  • C++语言
    +关注

    关注

    0

    文章

    147

    浏览量

    6968

原文标题:嵌入式C++中常见的错误形式

文章出处:【微信号:嵌入式开发爱好者,微信公众号:嵌入式开发爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式C语言知识点总结

    怎么才能做好嵌入式开发?学好C语言吧!今天就来推荐篇大佬写的嵌入式C语言知识点总结
    发表于 09-27 09:53 1162次阅读

    嵌入式C开发中段错误的3种调试方法

    相信大家在嵌入式C开发中,或多或少都会遇到段错误(segmentation fault )。昨天分享了个总线错误的例子:
    发表于 07-11 09:42 258次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>开发中段<b class='flag-5'>错误</b>的3种调试方法

    嵌入式系统C语言编程中主要的错误处理方式

    本文主要总结嵌入式系统C语言编程中,主要的错误处理方式。
    发表于 07-24 16:40 885次阅读
    <b class='flag-5'>嵌入式</b>系统<b class='flag-5'>C</b>语言编程中主要的<b class='flag-5'>错误</b>处理方式

    总结嵌入式系统开发中常见的存储器及其特点

    总结嵌入式系统开发中常见的存储器及其特点
    发表于 12-17 06:11

    嵌入式C语言进阶之道

    C 语言的书有大堆,嵌入 C 语言的书也不少,但都不过是简单介绍一下标准
    发表于 04-19 10:15

    嵌入式实时程序设计中C/C++代码的优化

    本文简单介绍了嵌入式实时程序设计的特点和嵌入式系统设计中语言的选择,着重介绍了以下几种在嵌入式实时程序设计中优化 C/
    发表于 08-07 08:47 15次下载

    嵌入式C/C++语言精华文章集锦

    嵌入式C/C++语言精华文章集锦 面对个人的大型C/C++程序时,只看其对struct 的使
    发表于 03-10 09:06 91次下载

    嵌入式CC++语言精华文章集锦

    C/C++语言深层探索,包括嵌入式程序员需要知道的几个问题,嵌入式系统编程修炼,基ARM的嵌入式移植真实体验,深入浅出
    发表于 03-04 15:20 13次下载

    嵌入式 C C++语言精华文章集锦

    嵌入式 C C++语言精华文章集锦
    发表于 02-08 01:28 10次下载

    使用C++构建嵌入式开发框架

    使用C++构建嵌入式开发框架
    发表于 10-25 11:25 17次下载
    使用<b class='flag-5'>C++</b>构建<b class='flag-5'>嵌入式</b>开发框架

    嵌入式C/C++语言精华文章集锦

    嵌入式C/C++语言精华文章集锦
    发表于 10-27 14:48 65次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>/<b class='flag-5'>C++</b>语言精华文章集锦

    文了解PCB中常见14大错误

    文了解PCB中常见14大错误,具体的跟随小编一起来看一下
    的头像 发表于 07-22 11:29 5889次阅读

    嵌入式系统C语言编程中的错误处理资料总结

    本文主要总结嵌入式系统C语言编程中,主要的错误处理方式。文中涉及的代码运行环境如下:
    发表于 11-28 10:39 1904次阅读

    嵌入式C++编程

    编程特性来构建嵌入式系统您将了解如何将您的系统与外部外围设备以及使用驱动程序的有效方式集成指导您测试和优化代码以获得更好的性能并实现有用的设计模式将了解如何使用 Qt,这是用于构建嵌入式系统的流行 GUI 库。内容嵌入式系统介绍
    发表于 11-04 10:36 10次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C++</b>编程

    嵌入式C语言知识总结

    1 嵌入式C语言总结从语法上来说C语言并不复杂, 但编写优质可靠的嵌入式C程序并非易事,不仅需要
    发表于 12-20 19:44 12次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>语言知识<b class='flag-5'>总结</b>