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

devtools/2025/2/14 0:09:56/

一、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: 10return 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: 1func();  // 输出: Count: 2func();  // 输出: Count: 3return 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 和一个函数 printGlobalVarfile2.c 使用 extern 声明了 globalVar,这样它就可以访问和修改这个变量。


http://www.ppmy.cn/devtools/158626.html

相关文章

win11 终端乱码导致IDE 各种输出也乱码

因为 win11 终端乱码导致IDE 各种输出也乱码导致作者对此十分头大。所以研究了各种方法。 单独设置终端编码对 HKEY_CURRENT_USER\Console 注册表进行修改对 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processo 注册表进行修改使用命令[Console]::OutputEncoding [Syst…

5. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Nacos

一、什么是Nacos Nacos 是阿里巴巴开源的一款云原生应用基础设施&#xff0c;它旨在简化微服务架构中服务治理和配置管理的复杂性。通过 Nacos&#xff0c;服务在启动时可以自动注册&#xff0c;而其他服务则可以通过名称来查找并访问这些注册好的实例。同时&#xff0c;Nacos…

以讲故事手法在软文营销中运用2+1链动模式AI智能名片S2B2C商城小程序的策略研究

摘要&#xff1a;在数字化时代&#xff0c;软文营销作为一种非传统广告形式&#xff0c;凭借其隐蔽性、吸引力和情感共鸣的特点&#xff0c;在品牌传播与产品推广中发挥着越来越重要的作用。讲故事作为软文营销的一种经典手法&#xff0c;能够深度触达消费者内心&#xff0c;建…

2、k8s 二进制安装(详细)

k8s 二进制安装 IP规划初始化部署 etcd 集群在 etcd01 节点上操作准备cfssl证书生成工具&#xff0c;加权生成etcd证书上传etcd软件包启动 etcd 服务 部署 Master 组件部署 Worker Node 组件node 节点安装 docker部署组件 部署 CNI 网络组件部署 flannel简介部署 部署 Calico简…

ECharts鼠标悬浮提示框数字设置鼠标在左侧时 tooltip 显示到右侧,鼠标在右侧时 tooltip 显示到左侧。

ECharts鼠标悬浮提示框数字设置鼠标在左侧时 tooltip 显示到右侧&#xff0c;鼠标在右侧时 tooltip 显示到左侧。 tooltip: {trigger: item,valueFormatter: (value) > value.toFixed(2),position: function (pos, params, dom, rect, size) {// 鼠标在左侧时 tooltip 显示…

Redis性能优化

1.是否使用复杂度过高的命令 首先&#xff0c;第一步&#xff0c;你需要去查看一下 Redis 的慢日志&#xff08;slowlog&#xff09;。 Redis 提供了慢日志命令的统计功能&#xff0c;它记录了有哪些命令在执行时耗时比较久。 查看 Redis 慢日志之前&#xff0c;你需要设置慢…

模糊数学模型:基础概念

1965年&#xff0c;美国计算机与控制专家L.A. Zadeh教授在国际期刊《Information and Control》上发表了开创性论文《Fuzzy Sets》&#xff0c;标志着模糊数学这一新兴学科的诞生。模糊数学的核心思想是处理现实世界中广泛存在的“模糊现象”&#xff0c;例如“高个子”与“矮个…

SpringAI ollama + deepseek-r1模型整合案例(含代码)

本节讲述os7系统中安装ollama模型、及与springAI进行前后端整合的案例。代码已提交到gitcode上&#xff0c;大家可以下载并自己练习。 ollama官网&#xff1a;https://ollama.com/download/linux ps&#xff1a;其他模型&#xff1a;https://huggingface.co/models 一、os7 …