引言:
statickeyword不僅能夠修飾變數。並且能夠修飾函式。了解它的使用方法,不僅對閱讀別人的**有幫助,也有助於自己寫出更加健壯的程式。
使用方法:
用於不同的上下文環境時,statickeyword具有不同的意義。
(一)
當它用於函式定義時,或用於**塊之外的變數宣告時,statickeyword用於改動標示符的鏈結屬性,從externl改為internal。但標示符的儲存型別和作用域不受影響。這樣的方式宣告的函式或變數僅僅能用於宣告它們的原始檔裡。
(二)
當它用於**塊內部的變數宣告時,statickeyword用於改動變數的儲存型別,從自己主動變數改動為靜態變數。但變數的鏈結屬性和作用域不受影響。用這樣的方式宣告的變數在程式執行之前建立,並在程式的整個執行期間一直存在,而不是每次在**塊開始執行時建立,在**塊執行完成後銷毀。
演示樣例解析:
**解釋一:
main.c源**
#include #include "test.h"
void main(void)
test.c源**
#include static int i = 1;/*宣告為內部變數,僅僅能用於test.c原始檔*/
int j = 2;/*能夠作為外部變數使用,在main檔案裡用到了*/
static void fun1(void)/*宣告為內部函式,僅僅能用在test.c原始檔裡*/
void fun(void)/*能夠用在其它檔案裡,用在main檔案裡*/
test.h源**
extern int j;
extern void fun(void);
編譯上面的程式:gcc main.c test.c -o test生成可執行檔案test
執行可執行檔案test顯示結果例如以下:
i = 1, j = 2//該行是由main函式裡呼叫的test.c檔案裡的fun函式生成的
i+1 = 2, j+1 = 3//該行是由test檔案裡fun函式呼叫的fun1函式生成的
j = 2//這是由main函式使用外部變數j直接生成的
**解釋二:
test.c源**
#include void main(void)
teststatic.c源**
#include void main(void)
編譯上面的兩個檔案
gcc test.c -o test
gcc teststatic.c -o teststatic
生成兩個可執行檔案test和teststatic
使用size命令檢視兩個可執行檔案各個段大小:size test teststatic
text data bss dec hex filename
929 264 8 1201 4b1 test
929 268 8 1205 4b6 teststatic
使用static修飾的程式data段更大。由於它在程式執行之前建立,並一直存在到程式執行結束。
補充:
關於作用域儲存型別的解釋,參考:
C語言天天練(二) static關鍵字
引言 static關鍵字不僅可以修飾變數,而且可以修飾函式。了解它的用法,不僅對閱讀別人的 有幫助,也有助於自己寫出更加健壯的程式。用法 用於不同的上下文環境時,static關鍵字具有不同的意義。一 當它用於函式定義時,或用於 塊之外的變數宣告時,static關鍵字用於修改標示符的鏈結屬性,從ext...
C語言天天練(十) 結構體
引言 資料經常以成組的形式存在。在c中,使用結構可以把不同型別的值存放在一起。結構的宣告有兩種 1 struct 然後用標籤 去宣告結構體變數。2 typedef struct 然後用 去宣告結構體變數。此時 是個型別名,而不像上面的 是個標籤。結構成員可以是標量 陣列 指標甚至是其他結構。結構成員...
C語言天天練(二四) 記憶體分配
引言 對於c語言程式,了解它執行時在記憶體中是怎樣分配的對於我們理解它的執行機制是很實用的。以下就總結一下c語言程式的一些記憶體分配知識。一 一段c程式。編譯連線後形成的可執行檔案一般有 段 資料段 堆和棧等幾部分組成。當中資料段又包含僅僅讀資料段 已初始化的讀寫資料段和未初始化的bss段。例如以下...