C++是一種用于嵌入式開發(fā)的少數(shù)語言,但當(dāng)項目變得太大而不能有效使用C時,開發(fā)者通常采用C++。這些開發(fā)人員通常從C轉(zhuǎn)換為C++,語言之間的細(xì)微差別代表了他們學(xué)習(xí)曲線的一個重要部分。C++的結(jié)構(gòu)與C一樣,它們不相同。C++具有與結(jié)構(gòu)非常相似的類。本文將詳細(xì)介紹這些語言元素。
C語言中的結(jié)構(gòu)
C中的結(jié)構(gòu)是一個定制的復(fù)合數(shù)據(jù)項(對象),它可以由現(xiàn)有的內(nèi)置數(shù)據(jù)類型(int、char等)、位字段(指定位大小的整數(shù))和其他結(jié)構(gòu)構(gòu)成。其思想是聚合屬于一起的多個數(shù)據(jù)項。
在大多數(shù)情況下,在C中使用結(jié)構(gòu)非常簡單,使代碼更容易理解,而不會影響執(zhí)行效率。但是,嵌入式開發(fā)人員應(yīng)該注意兩點:
現(xiàn)代高端(通常為32位)處理器具有易于適應(yīng)結(jié)構(gòu)使用的指令集。事實上,它們正是為了做到這一點而設(shè)計的。然而,大多數(shù)低端CPU都不能提供這樣的效率,因此需要注意結(jié)構(gòu)的使用。
位字段是一個很好的特性,可以生成高效且可讀的代碼。嵌入式開發(fā)人員可能會立即發(fā)現(xiàn)一個機會:使用位字段訪問設(shè)備控制寄存器。許多外圍設(shè)備具有1字或1字節(jié)寬的寄存器,其中包含各種位字段。有時它可以發(fā)揮作用,但有兩個問題:
位字段的精確布局由編譯器決定。如果所有內(nèi)容都正確映射到設(shè)備上,代碼可能會正常工作。但是,更改編譯器,甚至只是更新編譯器,都可能會破壞代碼。
編譯器生成的用于訪問位字段的代碼很可能會使用大量和/或操作以及對寄存器的多次訪問,這可能會有問題。此外,一些設(shè)備寄存器是只寫的,這在編譯器生成的代碼中永遠(yuǎn)不會被容納。
雖然C結(jié)構(gòu)看起來有點像一種新的數(shù)據(jù)類型,但實際上并非如此。一個數(shù)據(jù)類型通常有一系列可以在其上執(zhí)行的操作;對于C結(jié)構(gòu),情況并非如此。要對C結(jié)構(gòu)執(zhí)行任何操作,除了生成指向它的指針之外,還需要訪問內(nèi)部字段,在嵌入式開發(fā)中,這件事用C++來解決。
C++中的類
C++語言具有許多面向?qū)ο蟮哪芰?。其中之一是類的概念,它支持更像新?shù)據(jù)類型的描述??梢詮念悓嵗兞?通常稱為對象),也就是說,這是一個新類型的對象。
C++類的語法與C結(jié)構(gòu)幾乎完全相同,有些非常相似的功能。然而,有一些重要的區(qū)別:
類還可以包含函數(shù)(稱為方法)。
成員變量和方法對外隱藏,除非它們的聲明遵循公共規(guī)則:
可以有一對特殊方法–構(gòu)造函數(shù)和析構(gòu)函數(shù)–分別在創(chuàng)建和銷毀類(對象)實例時自動運行。
可以使用特殊方法(成員函數(shù))定義處理新數(shù)據(jù)類型的運算符。
一個類可以用作另一個類定義的基礎(chǔ)(這稱為繼承)。
聲明新類型的變量(類的實例;對象)只需要類的名稱,而不需要關(guān)鍵字class。
C++中的結(jié)構(gòu)
除了類之外,C++還具有與C向后兼容的結(jié)構(gòu),然而,C++結(jié)構(gòu)也具有與類所擁有的相同的附加能力。這只是C++中結(jié)構(gòu)和類之間的唯一區(qū)別。正如我們所看到的,類中成員變量和函數(shù)的默認(rèn)可訪問性是私有的;結(jié)構(gòu)中的默認(rèn)值是public。
在C++中使用類和結(jié)構(gòu)
獲得這些信息后,我們強烈建議你不要過度利用這些信息。當(dāng)你需要額外的功能時,有很多理由只使用C和類中提供的功能類型的結(jié)構(gòu)。首先,這是一個代碼可讀性問題,編寫代碼時的一個關(guān)鍵優(yōu)先事項是確保代碼可讀。另外,嵌入式開發(fā)人員可能對細(xì)節(jié)不太清楚,以“非標(biāo)準(zhǔn)”方式編寫的代碼將令人困惑。