【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);
相关文章
|
6天前
|
存储 C语言
【C语言函数】static和extern关键字修饰
【C语言函数】static和extern关键字修饰
|
2月前
|
C语言
【C语言】:static和extern的详细介绍和使用
【C语言】:static和extern的详细介绍和使用
24 1
|
1天前
|
存储 缓存 编译器
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(下篇)
scanf处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。 解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。
|
1天前
|
存储 C语言
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(上篇)
printf 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。
|
2月前
|
存储 C语言
c语言scanf函数用法
c语言scanf函数用法
|
1月前
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析
|
2月前
|
存储 C语言
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
36 2
|
2月前
|
存储 C语言
C语言学习记录——复习数据存储类别(auto、register、static、extern)
C语言学习记录——复习数据存储类别(auto、register、static、extern)
25 1
|
2月前
|
程序员 C语言
C语言memcpy()函数用法
C语言memcpy()函数用法
|
2月前
|
C语言
C语言strcpy函数用法
C语言strcpy函数用法