【C語言天天練(二)】statickeyword
引言:
statickeyword不僅能夠修飾變量。並且能夠修飾函數。了解它的使用方法,不僅對閱讀別人的代碼有幫助,也有助於自己寫出更加健壯的程序。
使用方法:
用於不同的上下文環境時,statickeyword具有不同的意義。
(一)
當它用於函數定義時,或用於代碼塊之外的變量聲明時,statickeyword用於改動標示符的鏈接屬性,從externl改為internal。但標示符的存儲類型和作用域不受影響。這樣的方式聲明的函數或變量僅僅能用於聲明它們的源文件裏。
(二)
當它用於代碼塊內部的變量聲明時,statickeyword用於改動變量的存儲類型,從自己主動變量改動為靜態變量。但變量的鏈接屬性和作用域不受影響。用這樣的方式聲明的變量在程序運行之前創建,並在程序的整個運行期間一直存在,而不是每次在代碼塊開始運行時創建,在代碼塊運行完成後銷毀。
演示樣例解析:
代碼解釋一:
main.c源代碼
#include <stdio.h> #include "test.h" void main(void) { fun(); /*fun函數就是在test.c文件裏聲明的函數*/ printf("j = %d\n", j);/*j變量也是在test.c文件裏聲明的變量*/ }test.c源代碼
#include <stdio.h> static int i = 1;/*聲明為內部變量,僅僅能用於test.c源文件*/ int j = 2;/*能夠作為外部變量使用,在main文件裏用到了*/ static void fun1(void)/*聲明為內部函數,僅僅能用在test.c源文件裏*/ { printf("i+1 = %d, j+1 = %d\n", i+1, j+1); } void fun(void)/*能夠用在其它文件裏,用在main文件裏*/ { printf("i = %d, j = %d\n", i, j); fun1(); }
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 <stdio.h> void main(void) { int i = 1; printf("i = %d\n", i); }
#include <stdio.h> void main(void) { static int i = 1;/*用於代碼塊內部變量的聲明*/ printf("i = %d\n", i); }編譯上面的兩個文件
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段更大。由於它在程序運行之前創建,並一直存在到程序運行結束。
補充:
關於作用域存儲類型的解釋,參考:
http://blog.csdn.net/to_be_it_1/article/details/24450227
http://blog.csdn.net/to_be_it_1/article/details/24467879
【C語言天天練(二)】statickeyword