在C語言中,static有3個作用:
(1)在函數體,一個被聲明爲靜態的變量在這一函數體內被調用的過程中維持其值不變。
#include <stdio.h>
void test(void)
{
static int i = 0;
printf("%d\n", i++);
}
int main(void)
{
test();
test();
test();
return 0;
}
如果不使用static修飾 int i,結果爲。使用後結果爲。
(2)在模塊內,一個被聲明爲靜態的變量可以被模塊內所有的函數訪問,但不能被模塊外其他函數訪問。它是一個本地的全局變量。
在test.c裏面聲明一個全局變量
int a = 100;
在main.c中也聲明一個全局變量
int a = 200;
編譯器報錯
因爲a是非靜態全局變量,作用域是整個源程序,而靜態全局變量的作用域限制在定義該變量的源文件內有效。
test.c裏面的變量修改爲
static int a = 100;
編譯通過。
(3)在模塊內,一個被聲明爲靜態的函數只可被這一模塊內的其他函數調用,這個函數被限制在聲明它的模塊的本地範圍內使用。
比如static_test.h 的內容爲
#ifndef STATIC_TEST_H
#define STATIC_TEST_H
static void static_func(void);
void func(void);
#endif
static_test.c的內容爲
#include "static_test.h"
#include <stdio.h>
static void static_func(void)
{
printf("hello world\n");
}
void func(void)
{
static_func();
}
在main.c中去調用static_func(),編譯器會報錯。而static_test.c裏調用static_func()是可以的。從而說明static修飾的函數只能在模塊static_test.c裏面調用,不允許模塊外調用。
頭文件中static_func()不使用static修飾也可以編譯通過,但是依照代碼規範的要求,必須使用static修飾以增加閱讀性,頭文件使用static修飾表明了該函數不允許使用者調用。