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