Try   HackMD

Linux內核中Static、Extern使用

tags: Linux kernel

在研究linux過程中,會常常看到變數或函式前會加上static進行修飾,然而什麼時候應該要用到static?

若想要變數或函式只能在一個.c檔內部使用,就可以在變數或函式前加上static,以防止外部程式碼修改之。

例:
test.c

static int i = 0; static void function(int parameter){.}

相反地,若變數或函式需要到外部使用時,可在.h檔案裡加上extern。

例:
test.c

int i = 0; void function(int parameter){.}

test.h

extern int i; extern void function(int );

那為何需要用到static?

因為linux內核的程式龐大,對於C語言中的變數與函數都是所有人可以看見的,若在標頭檔.h宣告成extern則所有人皆可以訪問。因此,一旦變數或函數名稱相同,編譯器就會報錯。所以,若變數或函數不需被外部使用,建議皆加上static,限制其只能在.c檔內部裡被看見及使用。往後在宣告變數或函數名稱以及查找變數或函數被誰調用時也更佳容易,大幅降低各個程式相互影響。因此在寫驅動程序時,為了要符合驅動程序的模塊化設計思想,務必養成在變數及函式前加上static修飾的好習慣!

補充:

若在函數裡使用static定義變數,則該變數只在第一次進入函式時,賦予定義值,之後進入函式則不在賦予變數數值,且變數值會被保留。

void function(void) { static int i = 0; printf("function execution time: %d\n", i++); } int main(void) { function(); function(); function(); return 0; }

結果為

function execution time: 1
function execution time: 2
function execution time: 3