C语言中常见关键字(static,extern)

一、static的使用

主要是身体擦

在C语言中,static关键字可以用于修饰全局变量 和局部变量,但其作用不同。以下是详细的说明和示例:


1. static修饰全局变量

当static用于修饰全局变量时,它会限制该变量的作用域,使其仅在定义它的源文件内可见。其他源文件无法访问该变量。

特点:
  • 作用域:仅限于定义它的源文件(文件作用域)。

  • 生命周期:与程序的生命周期相同(静态存储期)。

  • 链接性 :内部链接(internal linkage),其他文件无法通过extern声明访问。

示例:

c

复制

复制代码
// file1.c
#include <stdio.h>

static int globalVar = 10;  // 静态全局变量,仅在file1.c中可见

void printGlobalVar() {
    printf("GlobalVar: %d\n", globalVar);
}

// file2.c
extern int globalVar;  // 错误:无法访问file1.c中的static全局变量

int main() {
    printGlobalVar();  // 输出: GlobalVar: 10
    return 0;
}

2. static修饰局部变量

当static用于修饰局部变量时,它会改变该变量的存储期 (生命周期),使其从自动存储期(函数调用结束后销毁)变为静态存储期(程序运行期间一直存在)。此外,static局部变量只会被初始化一次。

特点:
  • 作用域:仅限于定义它的函数或代码块(局部作用域)。

  • 生命周期:与程序的生命周期相同(静态存储期)。

  • 初始化:只初始化一次,后续函数调用会保留上一次的值。

示例:

c

复制

复制代码
#include <stdio.h>

void func() {
    static int count = 0;  // 静态局部变量
    count++;
    printf("Count: %d\n", count);
}

int main() {
    func();  // 输出: Count: 1
    func();  // 输出: Count: 2
    func();  // 输出: Count: 3
    return 0;
}

3. static修饰全局变量和局部变量的对比

特性 static全局变量 static局部变量
作用域 仅限于定义它的源文件(文件作用域) 仅限于定义它的函数或代码块(局部作用域)
生命周期 整个程序运行期间(静态存储期) 整个程序运行期间(静态存储期)
初始化 在程序启动时初始化一次 在第一次调用时初始化一次,后续调用保留值
链接性 内部链接(其他文件无法访问) 无链接性(仅限于函数内部)
典型用途 隐藏全局变量,避免命名冲突 在函数调用之间保留状态

4. 总结

  • static全局变量:用于限制全局变量的作用域,避免其他文件访问,增强模块化。

  • static局部变量:用于在函数调用之间保留状态,延长局部变量的生命周期。

2、extern的使用

使用extern声明变量

当你有一个全局变量定义在一个文件中,并希望在另一个文件中访问它时,你可以使用extern来声明它。

示例

假设你有两个文件:file1.c 和 file2.c。

file1.c

复制代码

c复制代码

|---|----------------------------------------------------------|
| | #include <stdio.h> |
| | |
| | // 定义全局变量 |
| | int globalVar = 10; |
| | |
| | void printGlobalVar() { |
| | printf("Global variable in file1.c: %d\n", globalVar); |
| | } |

file2.c

复制代码

c复制代码

|---|-----------------------------------------------------------------------------|
| | #include <stdio.h> |
| | |
| | // 声明全局变量(使用extern) |
| | extern int globalVar; |
| | |
| | void modifyGlobalVar() { |
| | globalVar = 20; |
| | } |
| | |
| | int main() { |
| | printGlobalVar(); // 调用file1.c中的函数 |
| | modifyGlobalVar(); |
| | printf("Global variable in file2.c after modification: %d\n", globalVar); |
| | return 0; |
| | } |

在这个例子中,file1.c 定义了一个全局变量 globalVar 和一个函数 printGlobalVar。file2.c 使用 extern 声明了 globalVar,这样它就可以访问和修改这个变量。

相关推荐
布莱克60535 分钟前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
ZhengEnCi2 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
取名真是3 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
罗西的思考3 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
揽星河..4 小时前
【C语言】底层程序设计
c语言·开发语言
沫璃染墨5 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
nm_zfyjt5 小时前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
xiaoye-duck6 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
w_zero_one6 小时前
算法--构造
java·数据结构·算法
其实防守也摸鱼7 小时前
信创安全竞赛知识总结与题库
大数据·网络·人工智能·算法·安全·php