(补充)static 和 extern
目录前提小知识作用域和生命周期extern用法staticstatic修饰局部变量static修饰全局变量static修饰函数一、前提static和extern都是C语⾔中的关键字。static是 静态的 的意思可以⽤来修饰局部变量修饰全局变量修饰函数extern是⽤来声明外部符号的。作⽤域scope是程序设计概念通常来说⼀段程序代码中所⽤到的名字并不总是有效可⽤的⽽限定这个名字的可⽤性的代码范围就是这个名字的作⽤域。1.局部变量的作⽤域是变量所在的局部范围。2.全局变量的作⽤域是整个⼯程项⽬。⽣命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的⼀个时间段。1.局部变量的⽣命周期是进⼊作⽤域变量创建⽣命周期开始出作⽤域⽣命周期结束。2.全局变量的⽣命周期是整个程序的⽣命周期。二、externextern 是声明外部标识符的关键字。// file1.c int g_val 100; // 定义开辟内存 // file2.c extern int g_val; // 声明告诉编译器g_val在其他文件 int main() { printf(%d, g_val); return 0; }extern 只是声明不会创建变量、不分配内存全局变量的定义只能有 1 次声明可以多次。extern 小结• 用来引用其他源文件中定义的全局变量 / 函数。• 只做声明不分配内存。• 不能在函数内部用 extern 定义局部变量。三、static 修饰局部变量static 有 3 个使用场景一共两条核心效果1. 改变生命周期放到静态存储区程序结束才销毁2. 改变链接属性把外部链接 → 内部链接只能当前.c文件使用其他文件 extern 也访问不到void test() { static int a 0; // static局部变量 a; printf(%d , a); } int main() { test(); test(); test(); return 0; } // 输出1 2 3普通局部变量每次调用函数进函数创建出函数销毁static 局部变量1. 存储位置从栈区 → 静态区2. 生命周期变长程序启动开辟内存程序结束销毁3. 作用域不变依旧只能在这个函数内部使用外面访问不了4. 只初始化 1 次后续调用不会重新初始化static 局部变量作用域不变生命周期变长四、static 修饰全局变量// file1.c static int g_num 10; // file2.c extern int g_num; int main() { printf(%d, g_num); // 编译报错访问不到 return 0; }普通全局变量外部链接整个工程所有文件都能 extern 访问static 全局变量1. 生命周期不变依旧在静态区程序结束销毁2. 作用域变小链接属性变成内部链接仅当前.c 文件可用别的源文件无法 extern 引用。static 全局变量生命周期不变作用域缩小到本文件。五、static 修饰函数// file1.c static void func() { printf(test static func); } // file2.c extern void func(); int main() { func(); // 报错找不到这个函数 return 0; }普通函数默认外部链接其他文件可以 extern 调用。static 修饰函数函数变成内部链接只能在当前.c源文件内调用工程里其他源文件无法使用。写工具库的时候把只供本文件内部调用的辅助函数加上 static防止命名冲突。六、总结1.static局部变量只初始化一次生命周期延长作用域不变2. static全局 / 函数限制只能本文件使用改变链接属性3. extern声明外部变量 / 函数不分配内存用于跨文件访问4. 核心区分作用域 能不能访问生命周期 变量内存是否存在