当前位置 博文首页 > 我的地盘我做主:【C语言】C语言实现静态代码块

    我的地盘我做主:【C语言】C语言实现静态代码块

    作者:[db:作者] 时间:2021-07-15 15:39

    问题引入

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

    • 有一个数组,数组元素个数比较多或具体个数不确定(不同产品宏定义不同)
    • 需要把所有元素初始化为特定值(比如是-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);
    

    如本文对你有些许帮助,欢迎打赏或通过里面链接购买书籍:
    支付宝打赏方式及我的购物小店

    cs