天天看點

C語言中static關鍵字的作用

static用法:

在C中,static主要定義全局靜态變量、定義局部靜态變量、定義靜态函數。

1、定義全局靜态變量:在全局變量前面加上關鍵字static,該全局變量變成了全局靜态變量。全局靜态變量有以下特點。

a.在全局區配置設定記憶體。

b.如果沒有初始化,其預設值為0.

c.該變量在本檔案内從定義開始到檔案結束可見。

2、定義局部靜态變量:在局部變量前面加上關鍵字static,其特點如下:

a.該變量在全局資料區配置設定記憶體。

b.它始終駐留在全局資料區,直到程式運作結束。

c. 其作用域為局部作用域,當定義它的函數或語句塊結束時,其作用域随之結束。

1 #include <stdio.h>
 2 
 3 void fn(void)
 4 {
 5     int n = 10;
 6 
 7     printf("n=%d\n", n);
 8     n++;
 9     printf("n++=%d\n", n);
10 }
11 
12 void fn_static(void)
13 {
14     static int n = 10;
15 
16     printf("static n=%d\n", n);
17     n++;
18     printf("n++=%d\n", n);
19 }
20 
21 int main(void)
22 {
23     fn();
24     printf("--------------------\n");
25     fn_static();
26     printf("--------------------\n");
27     fn();
28     printf("--------------------\n");
29     fn_static();
30 
31     return 0;
32 }      
-> % ./a.out 
n=10
n++=11
--------------------
static n=10
n++=11
--------------------
n=10
n++=11
--------------------
static n=11
n++=12      

3、定義靜态函數:在函數傳回類型前加上static關鍵字,函數即被定義為靜态函數,其特點如下:

a.靜态函數隻能在本源檔案中使用

b.在檔案作用域中聲明的inline函數預設為static類型

/* file1.c */
#include <stdio.h>

static void fun(void)
{
    printf("hello from fun.\n");
}

int main(void)
{
    fun();
    fun1();

    return 0;
}

/* file2.c */
#include <stdio.h>

static void fun1(void)
{
    printf("hello from static fun1.\n");
}      
/tmp/cc2VMzGR.o:在函數‘main’中:
static_fun.c:(.text+0x20):對‘fun1’未定義的引用
collect2: error: ld returned 1 exit status      

總結:用static定義的全局和局部靜态變量的差別是,全局的靜态變量的作用域和可見域都是從檔案的定義開始到整個檔案結束;而局部的靜态變量可見域是從檔案的定義開始到整個檔案結束,作用域是從該語句塊的定義開始到該語句塊結束。