当前位置: 首页 > news >正文

静态static关键字:从基础到实战

一、static 关键字在 C 语言中的应用

1、修饰局部变量

在 C 语言中,当static关键字修饰局部变量时,这个局部变量就成为了静态局部变量。与普通局部变量不同,静态局部变量存储在静态存储区,而不是栈区。这意味着它的生命周期从程序开始执行时开始,直到程序结束才结束 ,而不是在函数调用结束时就被销毁。不过,静态局部变量的作用域仍然局限于定义它的函数内部。

下面通过一个简单的计数器示例来展示static修饰局部变量的用法:

#include <stdio.h> void counter() { static int count = 0; // 静态局部变量,用于计数 count++; printf("Count: %d\n", count); } int main() { int i; for (i = 0; i < 5; i++) { counter(); } return 0; }

在上述代码中,count是一个静态局部变量。每次调用counter函数时,count的值都会保留上一次调用结束时的值,并在此基础上递增。如果count不是静态局部变量,每次调用counter函数时,count都会被初始化为 0,无法实现计数功能。运行上述代码,输出结果如下:

Count: 1 Count: 2 Count: 3 Count: 4 Count: 5

可以看到,count的值在每次调用counter函数时都得到了正确的累加,这就是静态局部变量的特性。

2、修饰全局变量

当static关键字修饰全局变量时,这个全局变量的作用域就被限制在了当前文件中,其他文件无法访问它。普通全局变量具有外部链接属性,在一个文件中定义后,其他文件可以通过extern关键字声明并使用;而被static修饰的全局变量具有内部链接属性,只能在本文件中使用。

假设有两个文件file1.c和file2.c,在file1.c中定义一个普通全局变量和一个静态全局变量:

// file1.c #include <stdio.h> int globalVar; // 普通全局变量 static int staticGlobalVar = 10; // 静态全局变量 void printVars() { printf("globalVar: %d\n", globalVar); printf("staticGlobalVar: %d\n", staticGlobalVar); }

在file2.c中尝试访问这两个变量:

// file2.c #include <stdio.h> extern int globalVar; // 声明外部变量 // extern int staticGlobalVar; // 这行代码会报错,因为staticGlobalVar是静态全局变量,作用域仅限于file1.c int main() { globalVar = 20; // staticGlobalVar = 30; // 这行代码会报错 printVars(); return 0; }

在上述代码中,globalVar是普通全局变量,在file2.c中通过extern声明后可以正常访问和修改;而staticGlobalVar是静态全局变量,在file2.c中无法访问,即使声明也会报错。这样可以避免在多文件项目中,不同文件的全局变量命名冲突,同时也提高了代码的安全性和模块化程度。

3、修饰函数

static关键字修饰函数时,这个函数就只能在当前文件中被调用,其他文件无法调用它。这与静态全局变量类似,限制了函数的作用域。普通函数具有外部链接属性,在一个文件中定义后,其他文件可以直接调用;而静态函数具有内部链接属性,只在本文件内可见。

例如,在file1.c中定义一个静态函数和一个普通函数:

// file1.c #include <stdio.h> static void staticFunction() { printf("This is a static function.\n"); } void normalFunction() { printf("This is a normal function.\n"); staticFunction(); // 在本文件内可以调用静态函数 }

在file2.c中尝试调用这两个函数:

// file2.c #include <stdio.h> // void staticFunction(); // 这行代码会报错,因为staticFunction是静态函数,作用域仅限于file1.c extern void normalFunction(); // 声明外部函数 int main() { normalFunction(); // staticFunction(); // 这行代码会报错 return 0; }

在上述代码中,normalFunction是普通函数,在file2.c中声明后可以正常调用;而staticFunction是静态函数,在file2.c中无法调用,即使声明也会报错。静态函数常用于实现一些只在本文件内部使用的辅助函数,将其隐藏起来,避免被其他文件误调用,同时也增强了代码的封装性和安全性。

http://www.jsqmd.com/news/311737/

相关文章:

  • 好写作AI:降重≠降智!AI合规操作指南,让你的论文既安全又“贵气”
  • 2026年一体化智能泵站/污水提升泵站/一体式泵站实力厂家推荐:聚焦技术领先与多场景应用方案
  • PDF-XChange Editor能帮忙解决PDF处理的难题吗?
  • 主流苏宁易购礼品卡回收方式
  • Nginx跨域问题与 MIME 类型错误深度排错指南:解决 MIME type of “application/octet-stream“ 报错
  • 道可云人工智能每日资讯|北京市海淀区人工智能科普应用协会成立
  • 聊聊靠谱的货运发货专业公司,安徽点对点物流公司值得推荐吗?
  • 2026年鲜花批发评估排名,昆明珍情花卉上榜值得关注
  • 2026年鲜花批发选购指南,盘点昆明靠谱的鲜花批发服务公司
  • 盘点高压清洗机防护袖套生产厂,靠谱推荐来了
  • 工业机器人培训学校费用多少,潍坊渤海职业培训学校价格合理
  • 哪家不锈钢卷加工厂合作案例多,华力钢业的价格和服务靠谱不?
  • 构建区域创新生态,破解科技成果转化瓶颈
  • 从传统转化困局到生态协同机制,成果转化智能顾问助力高校科研价值实现
  • 生态协同机制赋能高校科研成果转化——创新报告式解读
  • 高校院所科技成果转化的数智化破局之路
  • 高校院所科技成果转化数智服务平台:构建产学研协同创新新生态
  • 构建区域创新生态,推动科技成果转化新路径
  • vscode运行npm报错,npm : 无法加载文件 xxxxx/npm.ps1,因为在此系统上禁止运行脚本。
  • 中国省市县干旱指数数据集(1961-2022)
  • 2026年电气安全企业采购白皮书:优秀厂家、实力工厂、知名品牌技术应用评测与官方联系
  • CRM系统选型:全链路一体云平台厂商深度横评
  • Go编译报错“undefined: GoMapIterator”
  • 2026年国内做得好的ISO认证机构找哪家,CQC报告/REACH认证/CQC认证/企业诚信认证,ISO认证公司推荐
  • 有名的马耳他移民公司费用透明吗
  • 探讨水生态保护工程企业,河北景达环保在宁波的项目价格多少钱
  • 任广涛干锅鸭加盟价格多少,是比较靠谱的干锅鸭加盟企业吗?
  • 防爆高压清洗机品牌哪个好,沿海城市适用品牌分析
  • 细聊新阳光有轨电车厂家怎么样?口碑好不好?
  • 精谱品牌红外光谱仪质量靠谱吗,评测揭秘