1. 程式人生 > >關於函式名前加static的一些解釋

關於函式名前加static的一些解釋

遇到有函式名前有加static的函式,不太懂什麼意思。上網查了一下,網上有兩種說法.現複製整理了一下,有興趣的可以看一下大笑

說法一:

在函式的返回型別前加上關鍵字static,函式就被定義成為靜態函式。函式的定義和宣告預設情況下是extern的,但靜態函式只是在宣告他的檔案當中可見,不能被其他檔案所用。定義靜態函式的好處:
<1> 其他檔案中可以定義相同名字的函式,不會發生衝突
<2> 靜態函式不能被其他檔案所用。

 儲存說明符auto,register,extern,static,對應兩種儲存期:自動儲存期和靜態儲存期。 auto和register對應自動儲存期。具有自動儲存期的變數在進入宣告該變數的程式塊時被建立,它在該程式塊活動時存在,退出該程式塊時撤銷。

關鍵字extern和static用來說明具有靜態儲存期的變數和函式。用static宣告的區域性變數具有靜態儲存持續期(static storage duration),或靜態範圍(static extent)。雖然他的值在函式呼叫之間保持有效,但是其名字的可視性仍限制在其區域性域內。靜態區域性物件在程式執行到該物件的宣告處時被首次初始化。
C語言中使用靜態函式的好處:
      靜態函式會被自動分配在一個一直使用的儲存區,直到退出應用程式例項,避免了呼叫函式時壓棧出棧,速度快很多。 
      關鍵字“static”,譯成中文就是“靜態的”,所以內部函式又稱靜態函式。但此處“static”的含義不是指儲存方式,而是指對函式的作用域僅侷限於本檔案。 使用內部函式的好處是:不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其它檔案中的函式同名,因為同名也沒有關係。 

c語言中static的語義

1.static變數:1).區域性a.靜態區域性變數在函式內定義,生存期為整個源程式,但作用域與自動變數相同,只能在定義該變數的函式內使用。退出該函式後, 儘管該變數還繼續存在,但不能使用它。b.對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予0值。而對自動變數不賦初值,則其值是不定的。2).全域性全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。但是他們的作用域,非靜態全域性 變數的作用域是整個源程式(多個原始檔可以共同使用); 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。

2.static函式(也叫內部函式)只能被本檔案中的函式呼叫,而不能被同一程式其它檔案中的函式呼叫。區別於一般的非靜態函式(外部函式)     static在c裡面可以用來修飾變數,也可以用來修飾函式。先看用來修飾變數的時候。變數在c裡面可分為存在全域性資料區、棧和堆裡。其實我們平時所說的堆疊是棧而不包含對,不要弄混。

說法二:

為什麼不自己去實踐呢?

在C裡面,所謂 static ,只是限制在當前原始檔————這個只是對於編譯器/連結器而言。但實際上,執行時,static和普通的extern 的函式/變數,沒有區別。

例如:使用函式指標/變數指標,完全可以訪問其他檔案的 static 變數/函式

file01.h
int * iptr01;
typedef void (* funcPtr)(void);
funcPtr pfun01;
----------------------------

file01.c
#include "file01.h"
static int ivar01 = 36;
int * iptr01 = &ivar01;

static void hwfun (void);
funcPtr pfun01 = &hwfun;

void hwfun (void)
{
printf("hello world\n");
}
-------------------------

file02.c
#include "file01.h"
............
//在某個程式碼內
*iptr01 = 72;
//file01.c 中的ivar01  變為72;
pfun01();
//呼叫了file01.c 中的hwfun ,打印出hello world

個人感覺說法二比較對,說法一也為我們普及了許多知識微笑