【C语言】【static用法】C语言实现静态代码块

简介: 【C语言】【static用法】C语言实现静态代码块

问题引入


有这样一个需求,希望某函数里的一段代码(如初始化)仅执行一次。


比如:


  • 有一个数组,数组元素个数比较多或具体个数不确定(不同产品宏定义不同)


  • 需要把所有元素初始化为特定值(比如是-1,不是0)


  • 仅初始化为一次(不管调用多少次)


此时就没办法直接用下面两种方式实现:


static INT32 szArrCountryCode[CARD_NUM] = {-1}


for (i=0; i<CARD_NUM; i++)
{
    szArrCountryCode[i] = -1;
}


来实现。


如果是Java语言,非常简单,可利用static的代码块来做:


static{
    int[] szArrCountryCode= new int[CARD_NUM];
    for(int i = 0; i < CARD_NUM; i++)
    {
        szArrCountryCode[i] = -1;
    }
}


解决方案


方法一、利用static BOOL类型变量直接控制


  • 这种比较常用,大多数人马上就能想出来的做法。


staic BOOL bSzArrCountryCodeInit = FALSE;
if (!bSzArrCountryCodeInit )
{
    for (i=0; i<CARD_NUM; i++)
    {
        szArrCountryCode[i] = -1;
    }
    bSzArrCountryCodeInit  = TRUE;
}


  • 上述思路的一个变体:


void initszArrCountryCode()
{
  for (i=0; i<CARD_NUM; i++)
  {
      szArrCountryCode[i] = -1;
    }
    bSzArrCountryCodeInit   = TRUE;
}
static BOOL bSzArrCountryCodeInit = FALSE;
bSzArrCountryCodeInit == FALSE?(initszArrCountryCode()):;


方法二、利用static变量的初始化


例1、利用赋值语


BOOL initszArrCountryCode()
{
  for (i=0; i<CARD_NUM; i++)
  {
      szArrCountryCode[i] = -1;
    }
    return TRUE;
}
static BOOL bSzArrCountryCodeInit  = initszArrCountryCode();


例2、利用逗号运算符


  • 由于代码块嵌套到static变量的初始化中,所以可保证代码块仅被执行一次:


void initszArrCountryCode()
{
  for (i=0; i<CARD_NUM; i++)
  {
      szArrCountryCode[i] = -1;
    }
}
static bool dummy = (initszArrCountryCode(),true);
相关文章
|
2月前
|
C语言
C语言判断逻辑的高阶用法
在C语言中,高级的判断逻辑技巧能显著提升代码的可读性、灵活性和效率。本文介绍了六种常见方法:1) 函数指针,如回调机制;2) 逻辑运算符组合,实现复杂条件判断;3) 宏定义简化逻辑;4) 结构体与联合体组织复杂数据;5) 递归与分治法处理树形结构;6) 状态机管理状态转换。通过这些方法,可以更高效地管理和实现复杂的逻辑判断,使代码更加清晰易懂。
226 88
|
5月前
|
C语言
【C语言】:static和extern的详细介绍和使用
【C语言】:static和extern的详细介绍和使用
39 1
|
1月前
|
C语言 C++
C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
45 10
|
3月前
|
存储 缓存 编译器
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(下篇)
scanf处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。 解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。
149 2
|
3月前
|
存储 C语言
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(上篇)
printf 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。
73 1
|
3月前
|
存储 C语言
【C语言函数】static和extern关键字修饰
【C语言函数】static和extern关键字修饰
|
5月前
|
存储 C语言
c语言scanf函数用法
c语言scanf函数用法
|
5月前
|
存储 C语言
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
75 2
|
4月前
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析
|
5月前
|
程序员 C语言
C语言memcpy()函数用法
C语言memcpy()函数用法