<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 在嵌入式軟件編程中深入理解關(guān)鍵字

在嵌入式軟件編程中深入理解關(guān)鍵字

作者: 時(shí)間:2009-11-17 來(lái)源:網(wǎng)絡(luò ) 收藏

③位于模塊內的靜態(tài)函數只能被此模塊內的其他函數調用。也就是說(shuō),這個(gè)函數的作用域為聲明所在的模塊。

本文引用地址:http://dyxdggzs.com/article/152278.htm


為了清楚地static的3種用法,必須首先了解C語(yǔ)言中每個(gè)標識符都具有的作用域、鏈接和存儲持續期等特性的含義。在ISO C99標準中,其定義如下:
①對象的作用域指的是它僅在程序的某個(gè)區域中是可見(jiàn)的(即可以使用)。常見(jiàn)的作用域有文件作用域和塊作用域。
②對象的存儲持續期決定對象的生命周期,即在程序執行某段區間中為對象保留存儲區。有兩種類(lèi)型的存儲持續期:靜態(tài)的和自動(dòng)的。靜態(tài)存儲持續期的對象的生命周期為程序執行的全過(guò)程,它的值在程序啟動(dòng)前僅初始化一次。
③鏈接指的是在不同作用域中聲明的或者同一個(gè)作用域中多次聲明的標識符可以引用相同的對象或函數。有3種類(lèi)型的鏈接:外部、內部和無(wú)。在情況②和③中,static分別用來(lái)修飾全局變量glob-al和函數foo,改變它們的鏈接特性,使它們具有內部鏈接。也就是說(shuō),只有在定義它們的翻譯單元或者文件內才能使用它們,這對于創(chuàng )建模塊化的軟件非常重要。
與static相反,extern修飾的對象或函數具有外部鏈接。對于那些暴露給外部使用的接口函數應該使用ex-tern限定,那些非接口函數,例如工具函數或與實(shí)現細節相關(guān)的函數,則應該顯式地使用static限定。這是因為如果函數聲明不帶任何存儲類(lèi)說(shuō)明符,那么它具有外部鏈接就好像使用了extern一樣。
在情況①中,static用來(lái)修飾局部變量local,將local的存儲持續期由自動(dòng)的改變?yōu)殪o態(tài)的,這樣在foo函數的多次調用間會(huì )為其保留值。注意作用域、鏈接和存儲持續期特性之間是正交的。例如在情況①中,雖然變量local的存儲持續期變成靜態(tài)的,但是它的作用域仍然是塊作用域。


3 volatile
volatile用來(lái)聲明這樣的對象,它們的值可能由于程序控制之外的事件而被潛在改變。volatile強制編譯器不會(huì )對其所限定的對象進(jìn)行任何優(yōu)化,每次讀寫(xiě)都必須訪(fǎng)問(wèn)實(shí)際的存儲器而不能使用寄存器中的副本。在實(shí)踐中,它大量的用來(lái)描述一個(gè)對應于內存映射的輸入/輸出端口,例如飛利浦公司LPC21xx系列ARM處理器的向量地址寄存器定義為:
#define VICVectAddr (*((volatile unsigned long*)0xFFFFF030))
其次,中斷服務(wù)例程中使用的非自動(dòng)變量或者多線(xiàn)程應用程序中多個(gè)任務(wù)共享的變量也必須使用volatile進(jìn)行限定。例如在下面的示例中,如果沒(méi)有使用volatile限定g_Flag變量,編譯器看到在foo函數中并沒(méi)有修改g_Flag,可能只執行一次g_Flag讀操作并將g_Flag的值緩存在寄存器中,以后每次g_Flag讀操作都使用寄存器中的緩存值而不進(jìn)行存儲器訪(fǎng)問(wèn),導致some_action函數永遠無(wú)法執行。


4 Dacked
中,經(jīng)常需要精確控制結構體在內存中的布局和訪(fǎng)問(wèn)非自然對齊的數據,但是C語(yǔ)言標準中并沒(méi)有統一的規定而是留給編譯器廠(chǎng)商自行處理。在A(yíng)RM C編譯器中,使用__packed將任何類(lèi)型的對齊設置為1字節。在實(shí)踐中,__packed主要有兩個(gè)功能:其一,當它修飾指針時(shí),表示此指針指向的地址是非自然對齊的,編譯器會(huì )生成特殊的代碼以確保獲得正確的結果;其二,當它修飾結構體、聯(lián)合或它們中的域時(shí),可以用來(lái)創(chuàng )建沒(méi)有填充的結構。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>