在C語言中,static
關鍵字有多個用途,具體取決于它修飾的變量或函數。以下是static
關鍵字的一些常見用法:
靜態局部變量:
當static
用于函數內部時,它修飾的變量具有靜態存儲期。這意味著該變量在函數調用之間保持其值。靜態局部變量在首次調用函數時被初始化,并且只初始化一次。
void example() {
static int count = 0; // 靜態局部變量
count++;
printf("Count: %d\n", count);
}
靜態全局變量:
當static
用于函數外部時,它修飾的全局變量具有靜態存儲期。這限制了變量的作用域僅在定義它的源文件內。靜態全局變量在程序啟動時被初始化,并且只初始化一次。
// file1.c
static int globalVar = 10; // 靜態全局變量,僅在file1.c中可見
void function() {
// ...
}
// file2.c
#include "file1.c"
void anotherFunction() {
// 可以使用globalVar,但不能直接聲明它,因為它只在file1.c中定義
}
靜態函數:
static
也可以用于修飾函數,使其僅在定義它的源文件內可見。這有助于隱藏實現細節并防止名稱沖突。
// file1.c
static void staticFunction() {
// ...
}
// file2.c
#include "file1.c"
void anotherStaticFunction() {
// 錯誤:無法訪問file1.c中的staticFunction,因為它在該文件之外不可見
}
靜態成員變量(C++):
在C++中,static
還可以用于修飾類的成員變量。靜態成員變量屬于類本身而不是類的任何特定實例。它們在類首次創建時被初始化,并且只初始化一次。所有類的實例共享同一個靜態成員變量。
class Example {
public:
static int staticMember; // 靜態成員變量
};
// 初始化靜態成員變量
int Example::staticMember = 0;
int main() {
Example e1;
Example e2;
// 所有Example對象共享同一個靜態成員變量
e1.staticMember = 5;
printf("e1.staticMember: %d\n", e1.staticMember); // 輸出5
printf("e2.staticMember: %d\n", e2.staticMember); // 輸出5
return 0;
}
請注意,在C++中使用static
關鍵字時,它總是具有內部鏈接性,即只能在定義它的源文件內訪問。這與C語言中的靜態全局變量相似,但C++中的靜態成員變量還具有一些額外的特性和用途。