gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:38:19 25 4
gpt4 key购买 nike

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

//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点。

最佳答案

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

但是这段代码的想法非常糟糕。只能考虑指针类型。

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

一般来说,IMO 在这段代码中使用这个宏是没有意义的,只会使代码更难以阅读并且更容易出错

关于c - 我对一些概念和代码有疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56698112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com