不同於其他關鍵字,他們都有多種用法,而且在一定環境下使用,可以提高程序的運行性能,優化程序的結構。這篇文章主要介紹了C語言中靜態關鍵字static的作用,對大家學習C語言非常有幫助。
靜態關鍵字static
C語言中,static關鍵字修飾變量和函數:
1、局部變量
2、全局變量
3、函數
static關鍵字最基本的用法是:
1、被static修飾的變量屬於類變量,可以通過類名.變量名直接引用,而不需要new出一個類來
2、被static修飾的方法屬於類方法,可以通過類名.方法名直接引用,而不需要new出一個類來
被static修飾的變量、被static修飾的方法統一屬於類的靜態資源,是類實例之間共享的,換言之,一處變、處處變。JDK把不同的靜態資源放在了不同的類中而不把所有靜態資源放在一個類里面,很多人可能想當然認為當然要這么做,但是是否想過為什么要這么做呢?個人認為主要有三個好處:
1、不同的類有自己的靜態資源,這可以實現靜態資源分類。比如和數學相關的靜態資源放在java.lang.Math中,和日歷相關的靜態資源放在java.util.Calendar中,這樣就很清晰了
2、避免重名。不同的類之間有重名的靜態變量名、靜態方法名也是很正常的,如果所有的都放在一起不可避免的一個問題就是名字重復,這時候怎么辦?分類放置就好了。
3、避免靜態資源類無限膨脹,這很好理解。
下面我們具體了解一下static關鍵字的用法。
修飾局部變量
1、用靜態關鍵字static修飾的局部變量,在編譯的過程中,會在數據區為該變量開辟空間,並對其進行初始化,如果代碼中未對其進行初始化,則系統默認初始化為0。
2、用static修飾的局部變量,會延長局部變量的壽命,超出函數的生存期。
3、對靜態關鍵字修飾的局部變量的初始化。
以下面兩個變量a和變量為b進行說明,在編譯過程中,發現變量a和b是靜態變量,會標識變量a與b,等到程序運行的時候,在主函數調用之前,對變量a和變量b分配空間,並對變量a進行初始化,由於變量b是由函數fun傳遞的參數進行初始化的,故會在程序調用函數時對變量b進行初始化,對變量b初始化之前,會檢查變量b的標識位,如果標識位為0,就會拿函數參數x對其進行初始化,標識位為1就不進行初始化。
static int a = 0;(編譯過程進行初始化)
static int b = x;(運行該代碼的時候進行初始化)
void fun(int x)
{
static int a = 10;
static int b = x;
a++;
b++;
}
修飾全局變量
全局變量定義在函數體外部,在全局數據區分配存儲空間,且編譯器會自動對其初始化。
普通全局變量對整個工程可見,其他文件可以使用extern外部聲明后直接使用。也就是說其他文件不能再定義一個與其相同名字的變量了(否則編譯器會認為它們是同一個變量)。
靜態全局變量僅對當前文件可見,其他文件不可訪問,其他文件可以定義與其同名的變量,兩者互不影響。
在定義不需要與其他文件共享的全局變量時,加上static關鍵字能夠有效地降低程序模塊之間的耦合,避免不同文件同名變量的沖突,且不會誤使用。
修飾函數
函數的使用方式與全局變量類似,在函數的返回類型前加上static,就是靜態函數。其特性如下:
靜態函數只能在聲明它的文件中可見,其他文件不能引用該函數
不同的文件可以使用相同名字的靜態函數,互不影響
非靜態函數可以在另一個文件中直接引用,甚至不必使用extern聲明
下面兩個文件的例子說明使用static聲明的函數不能被另一個文件引用:
/* file1.c */
#include <stdio.h>
static void fun(void)
{
printf("hello from fun.\n");
}
int main(void)
{
fun();
fun1();
return 0;
}
/* file2.c */
#include <stdio.h>
static void fun1(void)
{
printf("hello from static fun1.\n");
}
使用 gcc file1.c file2.c編譯時,錯誤報告如下:
/tmp/cc2VMzGR.o:在函數‘main’中:
static_fun.c:(.text+0x20):對‘fun1’未定義的引用
collect2: error: ld returned 1 exit status
修改文件,不使用static修飾符,可在另一文件中引用該函數:
/* file1.c */
#include <stdio.h>
void fun(void)
{
printf("hello from fun.\n");
}
/* file2.c */
int main(void)
{
fun();
return 0;
}
同樣使用 gcc file1.c file2.c編譯,編譯通過,運行結果如下:
-> % ./a.out
hello from fun.
總結
static是一個很有用的關鍵字,使用得當可以使程序錦上添花。當然,有的公司編碼規范明確規定只用於本文件的函數要全部使用static關鍵字聲明,這是一個良好的編碼風格。
無論如何,要在實際編碼時注意自己的編碼習慣,盡量體現出語言本身的優雅和編碼者的編碼素質。
以上就是關鍵字static的全部用法,希望對大家靈活運用關鍵字static有所幫助。
如果你想更好的提升你的編程能力,學好C語言C++編程!彎道超車,快人一步!
【C語言C++學習企鵝圈子】,分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!
編程學習書籍:
編程學習視頻:
