RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡單總結(jié)一下嵌入式C++中常見的錯誤形式

嵌入式開發(fā)愛好者 ? 來源:嵌入式開發(fā)愛好者 ? 2024-02-23 09:40 ? 次閱讀

1、有些關(guān)鍵字在 cpp 文件中多寫了

對于 C++ 類,一些關(guān)鍵字只要寫在 .h 中就好,cpp 中就不用再加上了,比如 virtual、static 等關(guān)鍵字,如果在 cpp 中多寫,編譯器會報錯。

比如如下的虛接口與靜態(tài)成員變量的定義,只要在頭文件中聲明就可以了。

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

2、函數(shù)參數(shù)的默認值寫到函數(shù)實現(xiàn)中了

帶有參數(shù)默認值的函數(shù),默認值是加在函數(shù)聲明處的,函數(shù)實現(xiàn)處的參數(shù)是不需要帶上的。

為了方便查看代碼,在函數(shù)實現(xiàn)處的參數(shù)中,將默認值注釋起來。正確的做法是,頭文件中有默認值:

BOOLCreateConf(constCString&strConfName,constBOOLbAudio=FALSE);
在函數(shù)實現(xiàn)處的參數(shù)中不用添加默認值:
BOOLCreateConf(constCString&strConfName,constBOOLbAudio/*=FALSE*/);
{
//......
}

3、在編寫類的時候,在類的結(jié)尾處忘記添加 ";" 分號了

在類的結(jié)尾處忘記添加分號,編譯會報錯,新人們有可能找了半天也沒找出引起編譯錯誤的原因。

其實很簡單,在類的結(jié)尾處忘記添加分號了。

classShape
{
//...
};

4、只添加了函數(shù)聲明,沒有函數(shù)實現(xiàn)

在添加類的函數(shù)時,只在類的頭文件中添加了函數(shù)聲明,但在 cpp 中卻沒有添加函數(shù)的實現(xiàn)。

如果其他地方調(diào)用到該函數(shù),在編譯鏈接的時候會報unresolved external symbol錯誤。因為沒有實現(xiàn),所有沒有供鏈接使用的 obj 文件。

5、cpp 文件忘記添加到工程中,導(dǎo)致沒有生成供鏈接使用的 obj 文件

在添加 C++ 類時,我們一般會添加 .h 頭文件和一個 .cpp 源文件。結(jié)果忘記把 .cpp 文件添加到工程中了,即沒有參與編譯,沒有生成供鏈接使用的 obj 文件。

如果有代碼調(diào)用到該 C++ 類的接口,則在編譯鏈接的時候會報unresolved external symbol錯誤,即鏈接不到該 C++ 類對應(yīng)的接口。

6、函數(shù)中返回了一個局部變量的地址或者引用

在函數(shù)中返回了一個局部變量的地址或者引用,而這個局部變量在函數(shù)結(jié)束時其生命周期就結(jié)束了,內(nèi)存就被釋放了。

當外部訪問到該變量的內(nèi)存,會觸發(fā)內(nèi)存訪問違例的異常,因為該變量的內(nèi)存已經(jīng)釋放了。比如如下的錯誤代碼:

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

//......

returnchResult;
}

7、忘記將父類中的接口聲明 virtual 函數(shù),導(dǎo)致多態(tài)沒有生效

代碼中本來要借助于 C++ 多態(tài)的虛函數(shù)調(diào)用,調(diào)用子類實現(xiàn)的接口,結(jié)果忘記在父類中將對應(yīng)的接口聲明為 virtual,導(dǎo)致沒有調(diào)用到子類實現(xiàn)的函數(shù)。

一定要記住,要實現(xiàn)多態(tài)下的函數(shù)調(diào)用,父類的相關(guān)接口必須聲明為 virtual。

classShape()
{
//...

virtualvoidDraw();

//...
}

8、該使用雙指針的地方,卻使用了單指針

有時我們需要調(diào)用一個接口去獲取某些數(shù)據(jù),接口中將數(shù)據(jù)拷貝到傳入的參數(shù)對應(yīng)的內(nèi)存中,此時設(shè)計參數(shù)時會傳入指針或引用。

我們在調(diào)用GetData 之前定義了結(jié)構(gòu)體指針p,并 new 出了對應(yīng)的結(jié)構(gòu)體對象內(nèi)存,應(yīng)該在定義 GetData 接口時應(yīng)該使用雙指針(指針的指針)的,結(jié)果錯寫成了單指針。

有問題的代碼如下:

structCodecInfo//編碼信息
{
 int nFrameRate;

//...
}


CodecInfo*pInfo=newCodecInfo;

GetAudioCodecPtr()->GetCodecInfo(pInfo);//調(diào)用AudioCodec::GetCodecInfo獲取編碼信息


AudioCodec::GetCodecInfo(CodecInfo*pInfo)//此處的參數(shù)不應(yīng)該使用單指針
{
memcpy(pInfo,m_codecInfo,sizeof(CodecInfo));
}

上面中的AudioCodec::GetCodecInfo接口的參數(shù)不應(yīng)該為單指針,應(yīng)該用雙指針,修改后的代碼應(yīng)該如下:

AudioCodec::GetCodecInfo(CodecInfo**pInfo)//此處的參數(shù)類型使用雙指針
{
memcpy(*pInfo,m_codecInfo,sizeof(CodecInfo));
}

9、發(fā)布 exe 程序時,忘記將 exe 依賴的 C 運行時庫和 MFC 庫帶上

比如新人用 VS-MFC 庫編寫一個測試用的工具軟件,結(jié)果在發(fā)布 release 版本程序時,沒有將程序依賴的 C 運行時庫帶上,導(dǎo)致該工具軟件在某些電腦中啟動報錯,提示找不到 C 運行時庫:

因為程序中依賴了動態(tài)版本的運行時庫和 MFC 庫,在發(fā)布程序時要將這些庫帶上。有些系統(tǒng)中沒有這些庫,程序啟動時就會報找不到庫,就會啟動失敗。

10、應(yīng)該使用深拷貝,卻使用了淺拷貝

本來應(yīng)該要進行深拷貝的,卻使用了淺拷貝(直接賦值),導(dǎo)致另個不同生命周期的 C++ 對象指向了同一塊內(nèi)存,一個對象將內(nèi)存釋放后,另一個對象再用到這塊內(nèi)存,就造成了內(nèi)存訪問違例,產(chǎn)生異常。

有個經(jīng)典的 C++ 筆試題,讓我們實現(xiàn) String 類的相關(guān)函數(shù),其主要目的就是用來考察對深拷貝與淺拷貝的理解的。題目中給出String類的聲明:

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

讓寫出上述幾個函數(shù)的內(nèi)部實現(xiàn)。這些函數(shù)的實現(xiàn)代碼如下:

//普通構(gòu)造函數(shù)
String::String(constchar*str)
{
if(str==NULL)
{
 m_data = new char[1];//得分點:對空字符串自動申請存放結(jié)束標志'?'的,加分點:對m_data加NULL判斷
*m_data='?';
}
else
{
intlength=strlen(str);
m_data=newchar[length+1];//若能加NULL判斷則更好
strcpy(m_data,str);
}
}


//String的析構(gòu)函數(shù)
String::~String(void)
{
delete[]m_data;//或deletem_data;
}


//拷貝構(gòu)造函數(shù)
String::String(const String &other)//得分點:輸入?yún)?shù)為const型
{
intlength=strlen(other.m_data);
m_data=newchar[length+1];//若能加NULL判斷則更好
strcpy(m_data,other.m_data);
}


//賦值函數(shù)
String & String::operator =(const String &other)//得分點:輸入?yún)?shù)為const型
{
if(this ==&other)//得分點:檢查自賦值
return*this;
if(m_data)
 delete[] m_data;//得分點:釋放原有的內(nèi)存資源
intlength=strlen(other.m_data);
 m_data = new char[length + 1];//加分點:對m_data加NULL判斷
strcpy(m_data,other.m_data);
return*this;//得分點:返回本對象的引用
}





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5082

    文章

    19104

    瀏覽量

    304793
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    613

    瀏覽量

    28360
  • C++語言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    6987

原文標題:嵌入式C++中常見的錯誤形式

文章出處:【微信號:嵌入式開發(fā)愛好者,微信公眾號:嵌入式開發(fā)愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式C語言知識點總結(jié)

    怎么才能做好嵌入式開發(fā)?學(xué)好C語言吧!今天就來推薦篇大佬寫的嵌入式C語言知識點總結(jié)。
    發(fā)表于 09-27 09:53 ?1172次閱讀

    嵌入式C開發(fā)中段錯誤的3種調(diào)試方法

    相信大家在嵌入式C開發(fā)中,或多或少都會遇到段錯誤(segmentation fault )。昨天分享了個總線錯誤的例子:
    發(fā)表于 07-11 09:42 ?291次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>開發(fā)中段<b class='flag-5'>錯誤</b>的3種調(diào)試方法

    嵌入式系統(tǒng)C語言編程中主要的錯誤處理方式

    本文主要總結(jié)嵌入式系統(tǒng)C語言編程中,主要的錯誤處理方式。
    發(fā)表于 07-24 16:40 ?922次閱讀
    <b class='flag-5'>嵌入式</b>系統(tǒng)<b class='flag-5'>C</b>語言編程中主要的<b class='flag-5'>錯誤</b>處理方式

    總結(jié)嵌入式系統(tǒng)開發(fā)中常見的存儲器及其特點

    總結(jié)嵌入式系統(tǒng)開發(fā)中常見的存儲器及其特點
    發(fā)表于 12-17 06:11

    嵌入式C語言進階之道

    C 語言的書有大堆,嵌入 C 語言的書也不少,但都不過是簡單介紹一下標準
    發(fā)表于 04-19 10:15

    嵌入式實時程序設(shè)計中C/C++代碼的優(yōu)化

    本文簡單介紹了嵌入式實時程序設(shè)計的特點和嵌入式系統(tǒng)設(shè)計中語言的選擇,著重介紹了以下幾種在嵌入式實時程序設(shè)計中優(yōu)化 C/
    發(fā)表于 08-07 08:47 ?15次下載

    嵌入式C/C++語言精華文章集錦

    嵌入式C/C++語言精華文章集錦 面對個人的大型C/C++程序時,只看其對struct 的使
    發(fā)表于 03-10 09:06 ?91次下載

    嵌入式CC++語言精華文章集錦

    C/C++語言深層探索,包括嵌入式程序員需要知道的幾個問題,嵌入式系統(tǒng)編程修煉,基ARM的嵌入式移植真實體驗,深入淺出
    發(fā)表于 03-04 15:20 ?13次下載

    嵌入式 C C++語言精華文章集錦

    嵌入式 C C++語言精華文章集錦
    發(fā)表于 02-08 01:28 ?10次下載

    使用C++構(gòu)建嵌入式開發(fā)框架

    使用C++構(gòu)建嵌入式開發(fā)框架
    發(fā)表于 10-25 11:25 ?17次下載
    使用<b class='flag-5'>C++</b>構(gòu)建<b class='flag-5'>嵌入式</b>開發(fā)框架

    嵌入式C/C++語言精華文章集錦

    嵌入式C/C++語言精華文章集錦
    發(fā)表于 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大錯誤,具體的跟隨小編一起來看一下
    的頭像 發(fā)表于 07-22 11:29 ?5918次閱讀

    嵌入式系統(tǒng)C語言編程中的錯誤處理資料總結(jié)

    本文主要總結(jié)嵌入式系統(tǒng)C語言編程中,主要的錯誤處理方式。文中涉及的代碼運行環(huán)境如下:
    發(fā)表于 11-28 10:39 ?1924次閱讀

    嵌入式C++編程

    編程特性來構(gòu)建嵌入式系統(tǒng)您將了解如何將您的系統(tǒng)與外部外圍設(shè)備以及使用驅(qū)動程序的有效方式集成指導(dǎo)您測試和優(yōu)化代碼以獲得更好的性能并實現(xiàn)有用的設(shè)計模式將了解如何使用 Qt,這是用于構(gòu)建嵌入式系統(tǒng)的流行 GUI 庫。內(nèi)容嵌入式系統(tǒng)介紹
    發(fā)表于 11-04 10:36 ?10次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C++</b>編程

    嵌入式C語言知識總結(jié)

    1 嵌入式C語言總結(jié)從語法上來說C語言并不復(fù)雜, 但編寫優(yōu)質(zhì)可靠的嵌入式C程序并非易事,不僅需要
    發(fā)表于 12-20 19:44 ?12次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>語言知識<b class='flag-5'>總結(jié)</b>
    RM新时代网站-首页