當你建立乙個標頭檔案庫時,經常會遇到乙個問題,就是在a檔案中定義乙個temple變數,想把它的值傳遞給b檔案使用,但是a檔案操作中函式又不可以帶返回引數,比如說中斷服務函式,那該怎麼辦?
如果你把temple定義在a中,然後讓a.h和b.h包含在includes.h中,然後把includes.h放在a.c和b.c中單個編譯是沒有問題的,但是鏈結的時候會出現問題,
「symbol temple multiply defined(by a.o and b.o)」
思是這個變數被多次定義了!!!
解決的方法是:
在a中定義temple變數後,在b中用extern 宣告一下例如:
1.在a中定義temple並且賦值:u16 temp2=0;
2.在b中宣告extern u16 temp2;
這裡只是宣告,不再賦值,否則會報錯!
這裡要注意變數定義和變數宣告的區別:
變數定義使用「資料型別+變數名稱」的形式,編譯器需要給它分配記憶體單元的;
而變數宣告使用「extern 變數型別+變數名稱」的形式,是告訴編譯器我這個變數將在其他外部c檔案中定義,我這裡只是在外部用它。編譯器就不會給它分配記憶體空間,而等到真正遇到變數定義時再給它分配記憶體空間。
高階
1、普通變數定義成全域性變數
如果是普通型別,完全可以不用*.**件,直接在*.c檔案中定義,在呼叫檔案處用extern
宣告,因為對於普通型別,編譯器是可以識別的。比如在乙個 my.c檔案中,我定義了char name[10];那麼在別的檔案中只要用extern
char
name[](由於是宣告,一位陣列可以省略大小,但不建議用指標,比較指標和陣列是兩回事)外部宣告就可以了,告訴編譯器這個變數我已經定義過了,具體怎樣,你慢慢找吧。這符合常理,因為char是編譯器能自主識別的型別。
2、自定義結構體型別定義成全域性變數
不同於普通型別,如果不預先通知編譯器,編譯器是不會識別你自定義的型別的。這個時候,.**件便出現了。不是定義結構型別不佔記憶體嗎?那好,我大結構體的定義放在 *.**件中,這樣一來,無論你incude無數次,記憶體都不會被占用的。而且這樣還有個好處,在別的檔案中可以include這個 *.**件,這樣,在這個檔案中,編譯器就可以識別你的自定義型別了,目的不就達到了?假如我在global.h中定義了
typedef struct _position
position;
那麼我可以在乙個global.c檔案中實現全域性變數的定義,不過要include那個*.**件,比如
include 「global.h」
position current,;
這樣就定義了cunrrent這個變數,在別的檔案中引用這個變數時,只要extern position
current;進行宣告,然後就可以用了,不過這個檔案也還得include 「global.h」
因為如果不包含,在這個檔案中是不識別position型別的。
1.如何引用乙個已經定義過的全域性變數?
答:extern
可以用引用標頭檔案的方式,也可以用extern關鍵字,如果用引用標頭檔案方式來引用某個在標頭檔案中宣告的全域性變理,假定你將那個編寫錯了,那麼在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那麼在編譯期間不會報錯,而在連線期間報錯。
2.全域性變數可不可以定義在可被多個.c檔案中?為什麼?
答:可以,在不同的c檔案中以static形式來宣告同名全域性變數。 可以在不同的c檔案中宣告同名的全域性變數,前提是其中只能有乙個c檔案中對此變數賦初值,此時連線不會出錯。
微控制器學習(一) 微控制器基礎 STM32
io四種輸入工作模式 io四種輸出工作模 stm32有8個16位定時器 stm32具有強大的異常響應系統,它把能夠打斷當前 執行流程的事件分為異常 exception 和中斷 interrupt 並把它們用乙個表管理起來,編號為 3 6的中斷向量定義為系統異常,編號從7到19的為外部中斷。中斷向量控...
微控制器 STM32庫開發
1.stm32庫開發是什麼?st公司推出的基於cortex m3核心的mcu 微控制器,也就是通常所說的微控制器 倡導使用韌體庫開發,僅通過呼叫庫裡面的api 應用程式介面 就可以迅速搭建乙個程式,寫出各種使用者需要的應用。庫開發方式自頂向下,可以避免對底層暫存器的繁瑣操作,能大大降低學習門檻和開發...
stm32mcuid規則 STM32微控制器命名規則
stm32 系列微控制器命名規則 stm32 f 103 c 8 t 6 1 2 3 4 5 6 7 8 產品系列名 固定為 stm32 和 產品系列 f 通用系列 0xx 入門級 mcu0x0 超值系列在傳統 位和位市場極具競爭力 0x1 實現了高度的功能整合,提供多種儲存容量和封裝的選擇,為成本...