C語言的做用域規則

做用域規則

程序中名字的做用域,通俗的講,就是這個名字在程序中的使用範圍。在C語言中,做用域的規則相對比較簡單,主要分爲 全局做用域局部做用域 兩種。函數

一個變量若是定義在函數中,那麼這個變量的做用域就是一個局部做用域,在函數外面不能訪問這個變量。在別的函數中定義同名的變量,也不會出現名字衝突,由於它們都處於各自的局部做用域中。code

外部變量或函數的做用域是從聲明的位置開始,到所在文件的末尾。若是須要在別的文件中引用不在這個文件中定義的外部變量,或者在這個變量定義以前使用,能夠經過關鍵字 extern 進行聲明。內存

extern 修飾符的做用是,告知該變量已經在別的地方定義了。外部變量和函數默認具備全局做用域,因此能夠在程序的任何位置進行引用。作用域

main() { ... }
int sp = 0;
double val[MAXVAL];
void push(double f) { ... }
double pop(void) { ... }

在上面的代碼中,sp和val的做用域是從它們定義的位置開始的,因此能夠在push和pop函數中引用這兩個變量。而在main函數中,不能直接引用這兩個變量。若是須要引用在後面定義的變量,能夠使用關鍵字 extern 聲明須要使用的變量。在上面的代碼中,若是須要在main中使用sp,則能夠這樣聲明:get

extern int sp;

聲明和定義的區別:聲明只是告知這個變量的類型,而定義一個變量,除了告知變量的類型,還會爲變量分配存儲空間。class

在一個程序中,外部變量的定義只能有一處,而外部變量的聲明能夠出如今任何須要引用這個變量的文件中。經過在文件中使用 extern 關鍵字聲明一個變量,能夠使用在別的地方聲明的變量。變量

static修飾符

在C語言中,static修飾符用於定義靜態變量。static除了能夠修飾變量外,還能夠修飾函數。引用

對於外部變量和函數,static修飾符會限制它們的做用域,使它們只能在定義它們的文件中使用,做用域不能傳播到文件外。程序

使用static修飾符,提供了一種隱藏名字的方式,能夠將名字限定在一個文件中,防止名字衝突。static

static char buf[BUFSIZE];
static int bufp = 0;
int getch(void) { ... }
void ungetch(int c) { ... }

在上面的代碼中,bufp和buf都只能在函數getch和ungetch中使用,而不能在別的文件中使用,即便在別的文件中使用了extern聲明。

static修飾符除了能夠修飾外部變量和函數外,也能夠做用於局部變量。經過static修飾的局部變量,在函數中的存儲空間將不會再函數結束後銷燬,而是一直存在直到程序結束。當程序再次被調用時,仍舊能夠訪問這個區域的內存。

相關文章
相關標籤/搜索