Từ khóa static trong C có ý nghĩa khác nhau tùy ngữ cảnh: lifetime (thời gian sống) và linkage (liên kết).
1. Static local variable (Trong hàm)
- Khởi tạo một lần duy nhất (lần đầu gọi hàm)
- Giữ giá trị giữa các lần gọi hàm
- Lifetime: suốt chương trình (static storage duration)
- Scope: cục bộ trong hàm
#include <stdio.h>
void counter() {
static int count = 0; // Chỉ init lần đầu
count++;
printf("Called %d times\n", count);
}
int main() {
counter(); // Called 1 times
counter(); // Called 2 times
counter(); // Called 3 times
return 0;
}
2. Static global variable (File scope)
- Internal linkage: chỉ nhìn thấy trong file này (translation unit)
- Tránh naming conflict với file khác
- Giống
staticcho function
// file1.c static int fileCounter = 0; // Chỉ file1 thấy được // file2.c // int fileCounter; // OK - biến khác hoàn toàn
3. Static function
- Internal linkage: không export symbol ra linker
- Chỉ gọi được trong cùng file
- Che giấu implementation detail
// helper.c
static void internalHelper() { ... } // Private
void publicAPI() { internalHelper(); }
Ví dụ từ bài gốc
#include <stdio.h>
int main() {
auto int a = -28; // auto = local bình thường (mặc định)
static int b = 8; // Static local
printf("Auto: %d\n", a); // -28
printf("Static: %d\n", b); // 8
printf("Sum: %d\n", a + b); // -20
return 0;
}
Kết quả
Auto: -28 Static: 8 Sum: -20
Static trong C++ (Mở rộng)
| Context | C | C++ (Additional) |
|---|---|---|
| Local variable | Giữ giá trị giữa các call | Giống C + thread-safe init (C++11) |
| Global variable | Internal linkage | Giống C + inline variable (C++17) |
| Function | Internal linkage | Giống C |
| Class data member | N/A | Chung cho tất cả object (shared) |
| Class member function | N/A | Không có this, chỉ truy cập static member |