extern 和 static在C語(yǔ)言的學(xué)習(xí)中尤為重要,所以我們有必要掌握。
一、頭文件 (1)C語(yǔ)言為什么要誕生頭文件在學(xué)習(xí)C語(yǔ)言的時(shí)候,當(dāng)我們需要寫一個(gè)比較大的項(xiàng)目的代碼的時(shí)候,我們常常需要用到頭文件,即以.h結(jié)尾的文件配合起來(lái)寫,那為什么需要有頭文件呢?我就單單的一個(gè)test.c文件就不能寫出來(lái)大的項(xiàng)目了嗎?從理論上來(lái)講,確實(shí)可以只通過(guò)一個(gè)test.c文件寫代碼,但是單純的使用源文件,組織項(xiàng)目結(jié)構(gòu)的時(shí)候,項(xiàng)目越大越復(fù)雜的時(shí)候,維護(hù)成本就越高!頭文件的出現(xiàn)大大降低了大型項(xiàng)目的維護(hù)成本,因?yàn)槿绻阍趖est.c文件使用了某個(gè)值100遍,但是你現(xiàn)在需要修改這個(gè)值,如果沒(méi)有頭文件,你就需要把這100個(gè)值都同時(shí)改掉,但是把它放到頭文件里面,再再test.c包含頭文件,那么當(dāng)需要修改這個(gè)值的時(shí)候只需要在頭文件修改這個(gè)值就能把test.c里面的所有這個(gè)值都改掉,大大降低了維護(hù)成本。
(2)頭文件一般放什么內(nèi)容1、C頭文件
2、所有變量的聲明
3、所有函數(shù)的聲明
4、#define , typedef , struct等等。
1、
聲明變量時(shí)不能設(shè)置初始值,例如extern int val=0 這種寫法是錯(cuò)誤的,因?yàn)槁暶鞯臅r(shí)候沒(méi)有開(kāi)辟空間,所以0不能賦值給val。
2、
變量的聲明必須帶上extern,因?yàn)槿绻麑懗?int val;編譯器可能把它看成是定義,而頭文件不能放定義,所以這種具有二義性的代碼,我們必須去避免。
3、
函數(shù)的聲明建議帶上extern,雖然編譯器看這個(gè)是函數(shù)的聲明還是定義是看函數(shù)體是否有內(nèi)容,但是當(dāng)你帶上extern的時(shí)候,代碼的可讀性就上來(lái)了,別人或者自己一眼就能看出這個(gè)是函數(shù)的定義。
1、全局變量可以跨文件訪問(wèn)嗎?
可以。
2、函數(shù)可以跨文件訪問(wèn)嗎?
可以。
3、在具體的應(yīng)用場(chǎng)景當(dāng)中,有沒(méi)有可能,我們不想讓全局變量或者函數(shù)跨文件訪問(wèn),只在本文件內(nèi)部訪問(wèn)?
答案是肯定的。
(1)static修飾全局變量,該變量只在本文件內(nèi)被訪問(wèn),不能被外部其他文件直接訪問(wèn)。
(2)static修飾函數(shù), 該函數(shù)只在本文件內(nèi)被訪問(wèn),不能被外部其他文件直接訪問(wèn)。
(3)static修飾局部變量,更改局部變量的生命周期,作用域不變。
1、為什么全局變量和函數(shù)可以跨文件訪問(wèn)?
因?yàn)橛幸欢ㄒ?guī)模的項(xiàng)目,一定是多文件的,多個(gè)文件之間,后續(xù)一定要進(jìn)行數(shù)據(jù)“交互”。代碼是需要模塊化的,不可能全部代碼都放在test.c文件中的,所以如果不能跨文件,也就說(shuō)明小組寫的代碼不能通用,那交互成本就會(huì)變得很高。
2、為什么是局部變量?為什么局部變量被static修飾后變成了全局生命周期??
(1)、因?yàn)榫植孔兞渴窃跅^(qū)開(kāi)辟內(nèi)存空間的,棧是動(dòng)態(tài)變化的,所以具有臨時(shí)性。
(2)、局部變量被static修飾之后變成了全局的生命周期的根本原因是它的存儲(chǔ)位置發(fā)生了變化,由棧區(qū)到靜態(tài)數(shù)據(jù)區(qū),所以具有了全局生命周期,但是作用域還是不變的。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧