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ù)"。

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也可以省略。