Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Biến static trong C

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 static cho 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)

Lưu ý quan trọng

  • Static local: Khởi tạo thread-safe từ C++11 (magic statics)
  • Static global: Ưu tiên anonymous namespace trong C++ (namespace { int x; })
  • Static member: Phải định nghĩa ngoài class (trừ C++17 inline static)
  • Khởi tạo zero-initialization trước các khởi tạo khác

Khi nào dùng static local?

  • Cache kết quả tính toán tốn kém (memoization)
  • Singleton pattern (Meyers singleton)
  • Counter, state giữ giữa các call
  • Tránh global variable
ContextCC++ (Additional)
Local variableGiữ giá trị giữa các callGiống C + thread-safe init (C++11)
Global variableInternal linkageGiống C + inline variable (C++17)
FunctionInternal linkageGiống C
Class data memberN/AChung cho tất cả object (shared)
Class member functionN/AKhông có this, chỉ truy cập static member