0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

static关键字的三种用法

撞上电子 2023-11-10 08:00 次阅读

C语言中,关键字"static"可以用于不同的上下文,具有不同的作用。以下是"static"在C语言中的主要作用:


1. 静态变量(Static Variables):

在C语言中,使用`static`关键字来声明静态变量是一种常见的用法,它具有以下主要作用:1. 生存期延长:静态变量的生存期在程序的整个运行期间,而不仅仅是在声明它的函数调用期间。这意味着静态变量会在程序启动时分配内存,并在程序终止时释放内存。这与自动变量(局部变量)不同,后者的生存期仅限于其所在函数的执行期间。2. 保持状态:静态变量的值在函数调用之间保持不变。每次调用包含静态变量的函数时,该变量的值会保持在上一次调用结束时的状态。这对于需要在多次函数调用之间共享信息的情况非常有用,例如计数器或缓存。下面是一个示例,演示了静态变量的作用:

#include

void countCalls() { // 静态变量,只初始化一次 static int count = 0; count++; // 每次调用递增计数 printf("Function has been called %d times\n", count);}
int main() { countCalls(); // 输出:Function has been called 1 times countCalls(); // 输出:Function has been called 2 timescountCalls();//输出:Function has been called 3 times
return 0;}

在上面的示例中,`count`是一个静态变量,它在`countCalls`函数的多次调用之间保持其值,而不会在每次函数调用时被重新初始化。这使得我们能够跟踪函数被调用的次数。

2. 静态函数(Static Functions):

在C语言中,使用`static`关键字来声明静态函数是一种常见的用法,它具有以下主要作用:1. 作用域限制:静态函数的作用域被限制在声明它的源文件(或编译单元)内部,不能在其他文件中被访问。这有助于确保函数的私有性,防止其他文件中的代码无意或恶意地调用它。2. 命名空间隔离:静态函数的名称在整个程序中具有唯一性,因为它们只在其源文件内部可见。这减少了命名冲突的风险,因为其他文件中可以有相同名称的函数,而不会导致冲突。3. 模块封装:静态函数通常用于实现文件范围的辅助功能,以便在同一文件内的多个函数之间共享代码,但不希望其他文件能够访问这些辅助函数。这有助于将相关功能封装在一个文件中,以提高代码的模块化和可维护性。以下是一个示例,演示了静态函数的作用:

// 文件: mymodule.c#include // 静态函数,只在当前文件内可见static void helperFunction() { printf("This is a helper function\n");}
void publicFunction() { printf("This is a public function\n"); helperFunction(); // 可以调用静态函数}// 文件: main.c#include "mymodule.c"
int main() { publicFunction(); // 可以调用公共函数 // helperFunction(); // 编译错误,无法访问静态函数 return 0;}

在上面的示例中,`helperFunction`是一个静态函数,它只能在`mymodule.c`文件中被访问。其他文件(例如`main.c`)无法访问它,从而确保了它的私有性和模块封装性。


3. 静态全局变量(Static Global Variables):

在C语言中,使用`static`关键字来声明静态全局变量是一种常见的用法,它具有以下主要作用:1. 作用域限制:静态全局变量的作用域被限制在声明它的源文件(或编译单元)内部,不能在其他文件中被访问。这使得该变量对于文件内的其他函数来说是可见的,但无法在其他文件中访问。这有助于确保全局变量的私有性,防止其他文件无意或恶意地修改它。2. 数据保持性:静态全局变量在程序的整个运行期间保持其值,而不会像普通全局变量那样被销毁和重建。这使得它适用于需要保持状态的情况,例如跟踪应用程序的配置设置、日志级别等信息。3. 命名空间隔离:静态全局变量的名称在整个程序中具有唯一性,因为它们只在其源文件内部可见。这减少了全局命名冲突的风险,因为其他文件可以有相同名称的全局变量,而不会导致冲突。以下是一个示例,演示了静态全局变量的作用:

// 文件: mymodule.c#include
// 静态全局变量,只在当前文件内可见static int moduleVar = 42;
void modifyModuleVar(int value) { moduleVar = value;}
void printModuleVar() { printf("moduleVar: %d\n", moduleVar);}// 文件: main.c#include "mymodule.c"
int main() { printModuleVar(); // 输出:moduleVar: 42 modifyModuleVar(100);printModuleVar();//输出:moduleVar: 100
// moduleVar = 200; // 编译错误,无法访问静态全局变量 return 0;}

在上面的示例中,`moduleVar`是一个静态全局变量,它只能在`mymodule.c`文件中被访问。其他文件(例如`main.c`)无法访问它,从而确保了它的私有性和模块封装性。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128763
  • static
    +关注

    关注

    0

    文章

    33

    浏览量

    10245
  • 关键字
    +关注

    关注

    0

    文章

    37

    浏览量

    6841
收藏 人收藏

    评论

    相关推荐

    关键字搜索文件夹中某个TXT文件

    文件夹中随时创造TXT文件,如何及时选出刚创造的文件?或关键字搜索出需要的TXT文件?
    发表于 02-06 15:22

    在NVM和本地\"内存中定义数组(静态 /global /local)的\"关键字是什么?

    在 NVM 和本地\"内存中定义数组(静态 /global /local)的\"关键字是什么? 还有与 32 位对齐的关键字怎么样。
    发表于 01-25 07:52

    IAR能否在整个工程中搜索关键字

    像mdk可以在整个工程中搜索关键字 IAR应该也有类似的功能吧,但是我貌似没有找到
    发表于 11-08 07:21

    指向code区数组的指针需不需要加code关键字的声明?

    指向code区数组的指针需不需要加code 关键字的声明?
    发表于 11-02 06:16

    在嵌入式中定义变量时volatile关键字的作用是什么?

    在嵌入式中定义变量时volatile关键字的作用?
    发表于 10-24 07:50

    程序中变量加volatile关键字是做什么用途的?

    为什么变量定义要加上这个关键字
    发表于 10-13 07:15

    Java中对static关键词的介绍

    static 是Java的一个关键字,可以用来修饰成员变量、修饰成员方法、构造静态代码块、实现静态导包以及实现静态内部类,下面我们来分别介绍。 1、修饰成员变量 用 static 修饰成员变量
    的头像 发表于 10-11 15:26 257次阅读
    Java中对<b class='flag-5'>static</b><b class='flag-5'>关键</b>词的介绍

    this关键字在Java中的用法

    this 关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。 其实简单来说 this 关键字就是表示当前对象,下面我们来具体介绍 this 关键字在Java中的用法。 1、
    的头像 发表于 10-10 16:49 320次阅读
    this<b class='flag-5'>关键字</b>在Java中的<b class='flag-5'>用法</b>

    浅析C语言中的regiseter关键字

    C语言中重要的关键字有很多,static const extern我们之前都讲过,还有一个在面试中出现的频率也比较高:register。
    的头像 发表于 08-25 17:10 831次阅读
    浅析C语言中的regiseter<b class='flag-5'>关键字</b>

    深入理解C++ “static关键字

    编译后的程序存储在硬盘上,准备执行时操作系统需要将它们读取到 RAM 中,这个时期就叫加载期。.data/.rodata 段的数据就是在这一时期分配内存的,一个常见的误区就是认为 static 数据是处于编译期。
    的头像 发表于 08-14 12:25 469次阅读
    深入理解C++ “<b class='flag-5'>static</b>”<b class='flag-5'>关键字</b>

    LL库中常见关键字__STATIC_INLINE

    LL库中常见关键字__STATIC_INLINE,其定义见cmsis_gcc.h
    的头像 发表于 07-24 11:30 839次阅读
    LL库中常见<b class='flag-5'>关键字</b>__<b class='flag-5'>STATIC</b>_INLINE

    C语言关键字const的几种用法

    本期来讲解一个C语言的关键字——const。
    发表于 06-21 11:05 1025次阅读
    C语言<b class='flag-5'>关键字</b>const的几种<b class='flag-5'>用法</b>

    【笔记】static 在C语言中的用法

    当`static`关键字用于不同的上下文时,其含义和作用也会有所不同。下面是更多示例代码,展示了`static`在不同用法下的具体效果:示例1:静态局部变量#includevoidin
    的头像 发表于 06-12 10:03 684次阅读
    【笔记】<b class='flag-5'>static</b> 在C语言中的<b class='flag-5'>用法</b>

    JAVA语言中Static关键字使用

    注:为解决安卓开发中服务器IP随机变化导致客户端找不到服务器的问题,通过关键字Static修饰成员变量User_url,通过客户端主函数代码获取输入的服务器IP值赋值给User_url,然后其它Activity即可使用该静态变量值,从而正确找到服务器。
    的头像 发表于 06-04 16:45 336次阅读
    JAVA语言中<b class='flag-5'>Static</b><b class='flag-5'>关键字</b>使用

    const关键字应用总结

    C++中的const关键字用法非常灵活,而使用const将大大改善程序的健壮性
    的头像 发表于 05-26 09:06 368次阅读