找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1976|回復(fù): 4
收起左側(cè)

容易出錯(cuò)!C語(yǔ)言中的外部變量關(guān)鍵詞extern可不能隨便使用

[復(fù)制鏈接]
ID:63113 發(fā)表于 2023-3-24 19:24 | 顯示全部樓層 |閱讀模式
本文介紹c語(yǔ)言中關(guān)鍵詞extern用法的一個(gè)注意事項(xiàng)。
在做項(xiàng)目開(kāi)發(fā)時(shí),在一個(gè)單片機(jī)C語(yǔ)言程序(用keil開(kāi)發(fā))中,如果有兩個(gè)C文件,在其中一個(gè)C文件(設(shè)為a文件)定義了一個(gè)全局變量v,并在此文件里的程序段里修改此變量,在另外一個(gè)C文件(設(shè)為b文件)里用外部變量(extern)的方法引用此變量,并讀取變量v,但是,在b中讀取時(shí)結(jié)果變量v出錯(cuò),出現(xiàn)亂值。
什么原因?
v在b文件里作為外部變量,被認(rèn)為分配的地址在其他地方,在b文件里只是讀取沒(méi)有寫(xiě)入,實(shí)際就沒(méi)有分配內(nèi)存地址,從而出錯(cuò)。
1.png
怎么修改?
方法1,在b文件中定義此變量v,在a文件中用外部變量的方式引用變量v,在a文件里修改變量v,在b文件中回讀變量v,結(jié)果正常。
這樣,在b文件里定義了變量v,分配了內(nèi)存地址,在a文件中引用外部變量v并進(jìn)行了寫(xiě)入操作,也分配了內(nèi)存地址,所以不出錯(cuò)。
2 - wu.png
方法2,最優(yōu)方法,在一個(gè)c文件(如a.c)里定義全局變量v,在其h文件(a.h)里再引用為外部變量,在用到變量v的其他c文件里include a.h,這樣的話不管是否讀寫(xiě)都無(wú)問(wèn)題。當(dāng)然,a.c里也要include a.h。
3.png
注意:全局變量才能被外部引用,靜態(tài)變量和局部變量不行的。

回復(fù)

使用道具 舉報(bào)

ID:491577 發(fā)表于 2023-3-25 13:15 | 顯示全部樓層
正常都是用.h文件作為多個(gè).c文件的連接,一個(gè)項(xiàng)目有多個(gè).c文件就是為了使用c文件里的函數(shù)和全局變量。如果有3個(gè)以上c文件用到同一個(gè)全局變量你的第一個(gè)方法就沒(méi)用了。
回復(fù)

使用道具 舉報(bào)

ID:1068313 發(fā)表于 2023-3-25 17:46 | 顯示全部樓層
說(shuō)到底,就是不規(guī)范書(shū)寫(xiě)
回復(fù)

使用道具 舉報(bào)

ID:378108 發(fā)表于 2023-3-25 18:21 | 顯示全部樓層
你的觀點(diǎn)是錯(cuò)誤的,B.C只是不知道 A.C改變了這個(gè)數(shù)據(jù)而已,這個(gè)變量本身就是同一個(gè)變量,又不是兩個(gè),他們的地址是一個(gè)!!!
這個(gè)一般是優(yōu)化引起的問(wèn)題,你可以降低優(yōu)化,或 給變量加上 volatile 說(shuō)明這個(gè)變量會(huì)被其他程序改變.
運(yùn)行的程序,是連接后的一個(gè)整體,它可不知道你有幾個(gè)文件.

評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
diyage + 5 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:63113 發(fā)表于 2023-3-27 11:20 | 顯示全部樓層
zhxzhx 發(fā)表于 2023-3-25 18:21
你的觀點(diǎn)是錯(cuò)誤的,B.C只是不知道 A.C改變了這個(gè)數(shù)據(jù)而已,這個(gè)變量本身就是同一個(gè)變量,又不是兩個(gè),他們的地 ...

感謝!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表