我对一些概念和代码有疑问

时间:2019-06-21 06:38:11

标签: c

我们知道,对于静态变量,以下代码是错误的。

//this fails: can't call gsl_vector_alloc() before main() starts

static gsl_vector *scratch = gsl_vector_alloc(20);

我们可以使用宏来解决这个问题。

这本书说我们必须[从零开始,在首次使用时分配]

#define Staticdef(type, var, initialization) \ 
    static type var = 0; \
    if (!(var)) var = (initialization);

//用法:

Staticdef(gsl_vector*, scratch, gsl_vector_alloc(20));

我不明白:

  1. 为什么我们必须从零开始。
  2. 这是指首次使用时分配。
  3. 我为什么不能写:

    #define Staticdef(type, var, initialization) \
        static type var = (initialization);
    
  4. “只要我们不希望初始化为零(或者说是指针,则为NULL),它就可以工作。如果是,它将在下一个回合中重新初始化。”我不明白为什么要重新初始化它。 [我知道静态变量可以初始化一次,即使框架死了也将记住它的值,这将用于计算调用函数的次数]

我是一名新的C程序员,所以如果我的问题似乎很明显,请对我好一点。 预先谢谢你!

好的,我现在完全理解上面的点1和点3,对于点2,我认为[首次使用时分配]与gsl_vector_alloc()函数有关,但是我仍然不确定点4。 / p>

1 个答案:

答案 0 :(得分:1)

静态局部变量仅初始化一个,并在两次调用之间保留其值。

但是这段代码的想法非常糟糕。仅可将其视为指针类型。

为什么。因为很难将零设为整数类型的非法值。

通常来讲,在此代码中使用此宏的IMO是没有意义的,只会使代码更难阅读且更容易出错