C语言中static的含义

Posted on Oct 23, 2014
C语言中static的含义以及C++中的static关键字有什么区别

static 的主要用用法

  1. 函数内变量(局部变量):静态存储期,只初始化一次,函数调用结束后不销毁
#include <stdio.h>

void counter() {
    static int count = 0;  // 只初始化一次
    count++;
    printf("count = %d\n", count);
}

int main() {
    counter();  // count = 1
    counter();  // count = 2
    counter();  // count = 3
    return 0;
}

该变量在函数结束后不消失,存储在静态区而非栈上。

  1. 文件作用域(全局变量/函数),内部链接:只在当前源文件可见,防止外部链接
// a.c
static int hidden_value = 42; // 不会被其他文件看到

static void internal_function() {
    // 只能在 a.c 中调用
}
// b.c
extern int hidden_value; // ❌ 链接失败:hidden_value 是 static,只在 a.c 中可见

static 修饰全局变量或函数时,表示只在当前编译单元(源文件)可见。

  1. 类中(仅 C++)属于类本身而非对象实例,所有对象共享
#include <iostream>

class MyClass {
public:
    static int count;             // 所有对象共享
    static void showCount() {     // 无需对象即可调用
        std::cout << count << std::endl;
    }
};

int MyClass::count = 0;  // 必须在类外定义

int main() {
    MyClass::count = 10;
    MyClass::showCount();  // 输出 10
}

可以看到前两条C/C++的用法是一样的,核心原因其实是:static变量存在于静态存储区(静态数据段) 使用static修饰过的变量/函数会存在于程序的整个生命周期

避免static在xx.h 头文件中滥用

// header.h
static int counter = 0;  // 每个包含的源文件都有一个副本(危险)

// 建议用 inline 或 extern