1. 程式人生 > >【C語言天天練(二)】statickeyword

【C語言天天練(二)】statickeyword

修飾 weight () main函數 class code keyword spa tail

引言:

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();
}
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 <stdio.h>

void main(void)
{
	int i = 1;
	printf("i = %d\n", i);
}
teststatic.c源代碼

#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