C语言中,static关键字作用

static修饰变量

1 在块中使用static修饰变量

  • 它具有静态存储持续时间、块范围和无链接。
    即作用域只能在块中,无法被块外的程序调用;变量在程序加载时创建,在程序终止时结束。
  • 它只在编译时初始化一次。如果没有显式初始化,默认初始化为0.
#include <stdio.h>

void trystat(void);

int main(void)
{
   int count;
   for (count = 1; count <= 3; count++)
   {
           printf("Here comes iteration %d:\n", count);
           trystat();
   }

   return 0;
}

void trystat(void)
{
   int fade = 1;
   static int stay = 1;

   printf("fade = %d and stay = %d\n", fade++, stay++);
}

程序执行结果
Here comes iteration 1:
fade = 1 and stay = 1
Here comes iteration 2:
fade = 1 and stay = 2
Here comes iteration 3:
fade = 1 and stay = 3

(1) 这里变量stay ,它从程序加载时开始存在,直到程序终止。但是它的范围仅限于trystat()函数块。只有当这个函数执行时,程序才能使用stay访问它指定的对象.

(2) 变量stay记得它的值增加了1,但是变量fade每次都会重新开始。这指出了初始化的不同之处:fadetrystat()每次调用都从新初始化,而stay变量只初始化一次。

(3) 静态变量在程序加载到内存之后就已经就位了。将语句static int stay = 1;放在trystat()函数中告诉编译器,只允许trystat()函数查看变量;它不是在运行时执行的语句。

2 在任何函数外部使用static修饰变量

  • 它具有静态存储时间、文件范围和内部链接。
    即作用域在当前文件之中(只能被同一文件中的函数使用),无法被其他文件调用
  • 它只在编译时初始化一次。如果没有显式初始化,默认初始化为0。

使用static修饰函数

  • 作用域限制在当前定义的文件中使用,从而避免了多文件函数名称冲突的可能性。通常文件中不作为接口的函数,建议使用static修饰,这样避免不同文件使用相同的函数名发生冲突。
static BOOL wavTaskCreated = FALSE;
static QueueHandle_t wav_msg_queue = NULL;
static WAV_PLAY_QUEUE_t wavPlayQueue;

static bool wav_get_version_flag = false;
static char wav_version[32];

static uint8_t *Wav_GetFileName(WAV_TYPE_t wav_type)
{

}

static bool Wav_GetFileInfo(WAV_FILE_INFO_t *pFileInfo, uint8_t *pFileName)
{

}

static bool Wav_GetVersion_Internal(WAV_FILE_INFO_t *pFileInfo)
{

}

static bool Wav_ReadFile(uint8_t *pData, uint32_t offset, uint32_t size)
{

}

static bool Wav_SendToDA(uint8_t *pFile, uint32_t size,  uint32_t volume)
{

}

static BOOL Wav_Put_Queue(WAV_TYPE_t wav_type, BOOL fromISR)
{

}

static BOOL Wav_Get_Queue(WAV_TYPE_t *pWavType)
{

}

static bool Wav_Play_Inernal(WAV_TYPE_t wav_type)
{

}

void Wav_Init(void)
{
    DA_Init(16000);

    if (!wavTaskCreated)
    {
        wavTaskCreated = TRUE;
        xTaskCreate(wav_task, "WAV", STACK_SIZE_TASK_WAV, NULL, PRIORITY_TASK_WAV, NULL);
        wav_msg_queue = xQueueCreate(WAV_MSG_QUEUE_LENGTH, sizeof(WAV_MESSAGE_t));

        wavPlayQueue.pWavTypeTable = malloc(WAV_PALY_QUEUE_MAX * sizeof(WAV_TYPE_t));
    }

    wavPlayQueue.front = 0;
    wavPlayQueue.end = 0;
    wavPlayQueue.sizeNow = 0;
    wavPlayQueue.totalSize = WAV_PALY_QUEUE_MAX;
}

bool Wav_Play(WAV_TYPE_t wav_type, bool force)
{
    if (!wavTaskCreated)
    {
        return false;
    }

    if (force)
    {
        vPortEnterCritical();

        watchdog_feed();

        Wav_Play_Inernal(wav_type);

        vPortExitCritical();

        return true;
    }

    bool rv = Wav_Put_Queue(wav_type, false);

    vTaskDelay(30);

    return rv;

}

上述为某平台使用DA播放wav的程序片段,

static uint8_t *Wav_GetFileName(WAV_TYPE_t wav_type);
static bool Wav_GetFileInfo(WAV_FILE_INFO_t *pFileInfo, uint8_t *pFileName);
static bool Wav_GetVersion_Internal(WAV_FILE_INFO_t *pFileInfo);
static bool Wav_ReadFile(uint8_t *pData, uint32_t offset, uint32_t size);
static bool Wav_SendToDA(uint8_t *pFile, uint32_t size,  uint32_t volume);
static BOOL Wav_Put_Queue(WAV_TYPE_t wav_type, BOOL fromISR);
static BOOL Wav_Get_Queue(WAV_TYPE_t *pWavType);
static bool Wav_Play_Inernal(WAV_TYPE_t wav_type);

上述函数为内部函数使用static修饰。

void Wav_Init(void);
bool Wav_Play(WAV_TYPE_t wav_type, bool force);

上述两个函数为模块接口(初始化DA和播放wav功能)供外部调用,没有使用static修饰。

原文地址:https://www.cnblogs.com/sky1blue/p/11260164.html

时间: 2024-11-01 02:08:07

C语言中,static关键字作用的相关文章

如果你去面试-C语言中static的作用

C 语言中 static的作用有三条 1,隐藏 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性. 如果加了static,就会对其它源文件隐藏. 利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突.Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用. 2,static的第二个作用是保持变量内容的持久. 存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一

C语言中static关键字的作用

static的作用(精辟分析) 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.为理解这句话,我举例来说明.我们要同时编译两个源文件,一个是a.c,另一个是main.c. 下面是a.c的内容 char a = 'A'; // global variable void msg()  {     printf("Hello\n"

c语言中static关键字用法详解

个人总结: 1.C不是面向对象的,在c中static修饰的变量或函数仅在当前文件中使用 2.C可以对局部变量使用static修饰(注意面向对象的java则不行),其放在全局区一直存在 概述static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护. 但是对于c语言初学者,static由于使用灵活,并不容易掌握.本文就static在c语言中的应用进行总结,供参考使用.错漏之处,请不吝指正. 在程序中使用static变量1. 局部变量普通局部变量是再熟悉不过的变量了

C语言中static的作用

(1)在函数体内,局部的static变量.生存周期为程序的整个生命周期:作用域却在定义了的函数体内.一个被声明为静态的变量在这个函数被调用过程中维持其值不变.因为它分配在静态存储区域,函数调用结束以后并不释放单元,但是在其他的作用域无法访问.当再次调用这个函数时,这个局部变量还存活,而且用在它的访问空间,因此访问的是上次调用后的值. (2)在文件模块内但在函数体外,一个声明为静态的全局变量可以被模块内的所有函数访问,但不能被模块外其他函数访问,它是一个本地的全局变量,限制静态全局变量的作用域.

在C语言中static的作用

1).一旦声明为静态变量,在编译时刻开始永远存在,不受作用域范围约束,但是如果是局部静态变量,则此静态变量只能在局部作用域内使用,超出范围不能使用,但是它确实还存在,还占用内存. 2).在模块内(在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其他函数访问,他是一个本地的全局变量. 3).在模块内,一个被声明为静态的函数只可被这一模块内的其他函数调用.那就是,这个函数被限制在声明它的模块的本地范围内使用. 原文地址:https://www.cnblogs.com/de

C语言中volatilekeyword的作用

一.前言 1.编译器优化介绍: 由于内存訪问速度远不及CPU处理速度,为提高机器总体性能,在硬件上引入硬件快速缓存Cache,加速对内存的訪问.另外在现代CPU中指令的运行并不一定严格依照顺序运行,没有相关性的指令能够乱序运行,以充分利用CPU的指令流水线,提高运行速度.以上是硬件级别的优化.再看软件一级的优化:一种是在编写代码时由程序猿优化,还有一种是由编译器进行优化.编译器优化经常使用的方法有:将内存变量缓存到寄存器:调整指令顺序充分利用CPU指令流水线,常见的是又一次排序读写指令.对常规内

c语言中static 用法总结(转)

惨痛教训: 假设在test.h中定义了一个static bool g_test=false; 若test1.c和test2.c都包含test.h,则test1.c和test2.c分别生成两份g_test,在test1.c 中置g_test=true,而test2.c中仍然为false并未改变!shit!! 一.c程序存储空间布局 C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令:      2)初始化数据段(数据段

C/C++中static关键字作用总结

1.先来介绍它的第一条也是最重要的一条:隐藏.(static函数,static变量均可) 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.举例来说明.同时编译两个源文件,一个是a.c,另一个是main.c. 1 //a.c 2 char a = 'A'; // global variable 3 void msg() 4 { 5 printf("Hello\n"); 6 } //main.c int main() { extern char a; //

C/C++中static关键字作用总结[转]

1.先来介绍它的第一条也是最重要的一条:隐藏.(static函数,static变量均可) 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.举例来说明.同时编译两个源文件,一个是a.c,另一个是main.c. //a.c char a = 'A'; // global variable void msg() { printf("Hello\n"); } //main.c int main() { extern char a; // extern varia

C语言中Static和Const关键字的的作用

程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中. 1.作用于变量: 用static声明局部变量-------局部变量指在代码块{}内部定义的变量,只在代码块内部有效(作用域),其缺省的存储方式是自动变量或说是动态 存储的,即指令执行到变量定义处时才给变量分配存储单元,跳出代码块时释放内存单元(生命期).用static声明局部变量时,则改变变量的存储方式(生 命期),使变量成为静态的局部变量,即编译时就为变量分配内存,直到程序退出才释放存储单元.这样,使