標題: 容易出錯!C語言中的外部變量關鍵詞extern可不能隨便使用 [打印本頁]
作者: yonko 時間: 2023-3-24 19:24
標題: 容易出錯!C語言中的外部變量關鍵詞extern可不能隨便使用
本文介紹c語言中關鍵詞extern用法的一個注意事項。
在做項目開發時,在一個單片機C語言程序(用keil開發)中,如果有兩個C文件,在其中一個C文件(設為a文件)定義了一個全局變量v,并在此文件里的程序段里修改此變量,在另外一個C文件(設為b文件)里用外部變量(extern)的方法引用此變量,并讀取變量v,但是,在b中讀取時結果變量v出錯,出現亂值。
什么原因?
v在b文件里作為外部變量,被認為分配的地址在其他地方,在b文件里只是讀取沒有寫入,實際就沒有分配內存地址,從而出錯。
1.png (51.27 KB, 下載次數: 39)
下載附件
2023-3-24 19:24 上傳
怎么修改?
方法1,在b文件中定義此變量v,在a文件中用外部變量的方式引用變量v,在a文件里修改變量v,在b文件中回讀變量v,結果正常。
這樣,在b文件里定義了變量v,分配了內存地址,在a文件中引用外部變量v并進行了寫入操作,也分配了內存地址,所以不出錯。
2 - wu.png (58.51 KB, 下載次數: 37)
下載附件
2023-3-24 19:24 上傳
方法2,最優方法,在一個c文件(如a.c)里定義全局變量v,在其h文件(a.h)里再引用為外部變量,在用到變量v的其他c文件里include a.h,這樣的話不管是否讀寫都無問題。當然,a.c里也要include a.h。
3.png (84.43 KB, 下載次數: 37)
下載附件
2023-3-24 19:24 上傳
注意:全局變量才能被外部引用,靜態變量和局部變量不行的。
作者: hhh402 時間: 2023-3-25 13:15
正常都是用.h文件作為多個.c文件的連接,一個項目有多個.c文件就是為了使用c文件里的函數和全局變量。如果有3個以上c文件用到同一個全局變量你的第一個方法就沒用了。
作者: 642744087 時間: 2023-3-25 17:46
說到底,就是不規范書寫
作者: zhxzhx 時間: 2023-3-25 18:21
你的觀點是錯誤的,B.C只是不知道 A.C改變了這個數據而已,這個變量本身就是同一個變量,又不是兩個,他們的地址是一個!!!
這個一般是優化引起的問題,你可以降低優化,或 給變量加上 volatile 說明這個變量會被其他程序改變.
運行的程序,是連接后的一個整體,它可不知道你有幾個文件.
作者: yonko 時間: 2023-3-27 11:20
感謝!
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |