问题引入
有这样一个需求,希望某函数里的一段代码(如初始化)仅执行一次。
比如:
- 有一个数组,数组元素个数比较多或具体个数不确定(不同产品宏定义不同)
- 需要把所有元素初始化为特定值(比如是-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);