C語言:static和extern關(guān)鍵字

static和extern對(duì)變量的作用

C語言里的變量分兩種:全局變量和局部變量。全局變量又分為外部全局變量和內(nèi)部全局變量。

全局變量

外部全局變量:定義的變量能被本文件和其他文件訪問

1、C語言里默認(rèn)情況下,所有的全局變量都是外部全局變量

2、不同文件中的同名外部變量,都代表著同一個(gè)變量

內(nèi)部全局變量:定義的變量只能被本文件訪問,不能被其他文件訪問。不同文件中的同名內(nèi)部全局變量,互不影響。

static定義一個(gè)內(nèi)部全局變量

#include <stdio.h>

static int b;// 定義一個(gè)內(nèi)部變量

int main()

{

}

extern聲明一個(gè)外部全局變量

在C語言中,全局變量定義的位置是有限制的。默認(rèn)情況下,一個(gè)函數(shù)不可以訪問在它后面定義的全局變量。

解決這個(gè)錯(cuò)誤的話,有2種辦法:

第1種辦法:將變量定義在main函數(shù)的前面。

第2種辦法:在main函數(shù)前面對(duì)變量進(jìn)行提前聲明,也就是讓main函數(shù)知道變量的存在就行了,至于變量定義在哪個(gè)位置,main函數(shù)不用管。

完整的變量聲明需要用extern關(guān)鍵字

#include <stdio.h>

static int b;// 定義一個(gè)內(nèi)部變量

extern int a;// 聲明一個(gè)外部變量

int main ( )

{

? ? ?a = 10;

? ? ?return 0;

}

int a;// 定義一個(gè)外部變量

局部變量

static修飾局部變量:

1、延長(zhǎng)局部變量的生命周期,程序結(jié)束的時(shí)候,局部變量才會(huì)被銷毀

2、并沒有改變局部變量的作用域

3、所有的函數(shù)都共享著一個(gè)變量

static修飾局部變量的使用場(chǎng)合:

1、如果某個(gè)函數(shù)的調(diào)用頻率特別高

2、這個(gè)函數(shù)內(nèi)部的某個(gè)變量值是固定不變的

#include <stdio.h>

void test(){

? ? static int b = 0;

? ? b++;

}

int main(){

? ? test();

? ? test();

? ? return0;

}

static和extern對(duì)變量的總結(jié)

1.extern可以用來聲明一個(gè)全局變量,但是不能用來定義變量

2.默認(rèn)情況下,一個(gè)全局變量是可以供多個(gè)源文件共享的,也就說,多個(gè)源文件中同名的全局變量都代表著同一個(gè)變量

3.如果在定義全局變量的時(shí)候加上static關(guān)鍵字,此時(shí)static的作用在于限制該全局變量的作用域,只能在定義該全局變量的文件中才能使用,跟其他源文件中的同名變量互不干擾。


static和extern對(duì)函數(shù)的作用

C語言里的函數(shù)分為外部函數(shù)和內(nèi)部函數(shù)

外部函數(shù):如果在當(dāng)前文件中定義的函數(shù)允許其他文件訪問、調(diào)用,就稱為外部函數(shù)。C語言規(guī)定,不允許有同名的外部函數(shù)。

內(nèi)部函數(shù):如果在當(dāng)前文件中定義的函數(shù)不允許其他文件訪問、調(diào)用,只能在內(nèi)部使用,就稱為內(nèi)部函數(shù)。C語言規(guī)定不同的源文件可以有同名的內(nèi)部函數(shù),并且互不干擾。

static可以定義和聲明一個(gè)內(nèi)部函數(shù)

extern可以定義和聲明一個(gè)外部函數(shù)(因?yàn)槟J(rèn)情況下,所有的函數(shù)就是外部函數(shù),所以默認(rèn)可以省略)

#include <stdio.h>

static void test2();// 聲明一個(gè)內(nèi)部函數(shù)

// 完整地定義一個(gè)外部函數(shù)

extern void test() {

? ? printf("調(diào)用了test函數(shù)\n");

}

// 默認(rèn)情況下,所有的函數(shù)都是外部函數(shù),所以可以省略extern

void test() {

? ? printf("調(diào)用了test函數(shù)\n");

? ? test2();

}

// 定義一個(gè)內(nèi)部函數(shù)

static void test2() {

? ? printf("調(diào)用了test2函數(shù)\n");

}

訪問其他文件中的外部函數(shù)

使用extern關(guān)鍵字在main函數(shù)前面對(duì)需要調(diào)用的函數(shù)進(jìn)行提前聲明,表示引用別人的"外部函數(shù)"。

C文件目錄

one.c文件

#include <stdio.h>

// 聲明一個(gè)內(nèi)部函數(shù)

static void test2();

// 完整地定義一個(gè)外部函數(shù)

/*

extern void test() {

? ? printf("調(diào)用了test函數(shù)\n");

}*/

// 默認(rèn)情況下,所有的函數(shù)都是外部函數(shù),所以可以省略extern

void test() {

? ? printf("調(diào)用了test函數(shù)\n");

? ? test2();

}

// 定義一個(gè)內(nèi)部函數(shù)

static void test2() {

? ? printf("調(diào)用了test2函數(shù)\n");

}

main.c文件

#include <stdio.h>

// 完整地聲明一個(gè)外部函數(shù)extern可以省略

extern void test();

int main(){

? ? test();

? ? return0;

}

運(yùn)行程序,可以發(fā)現(xiàn) "one.c中定義的函數(shù)" 已經(jīng)被 "main.c的main函數(shù)" 成功調(diào)用了。

static、extern與函數(shù)的總結(jié)

1、static

1.在定義函數(shù)時(shí),在函數(shù)的最左邊加上static可以把該函數(shù)聲明為內(nèi)部函數(shù)(又叫靜態(tài)函數(shù)),這樣該函數(shù)就只能在其定義所在的文件中使用。如果在不同的文件中有同名的內(nèi)部函數(shù),則互不干擾。

2.static也可以用來聲明一個(gè)內(nèi)部函數(shù)

2、extern

1.在定義函數(shù)時(shí),如果在函數(shù)的最左邊加上關(guān)鍵字extern,則表示此函數(shù)是外部函數(shù),可供其他文件調(diào)用。C語言規(guī)定,如果在定義函數(shù)時(shí)省略extern,則隱含為外部函數(shù)。

2.在一個(gè)文件中要調(diào)用其他文件中的外部函數(shù),則需要在當(dāng)前文件中用extern聲明該外部函數(shù),然后就可以使用,這里的extern也可以省略。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容