作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
来自21世纪的C书:
Static variables, even those inside of a function, are initialized when the program starts, before main, so you can’t initialize them with a nonconstant value.
//this fails: can't call gsl_vector_alloc() before main() starts
static gsl_vector *scratch = gsl_vector_alloc(20);This is an annoyance, but easily solved with a macro to start at zero and allocate on first use:
#define Staticdef(type, var, initialization) \
static type var = 0; \
if (!(var)) var = (initialization);
//usage:
Staticdef(gsl_vector*, scratch, gsl_vector_alloc(20));
我不明白这个宏有什么不同。预处理后它做的事情不完全一样吗?
最佳答案
Doesn't it do exactly the same thing after preprocessing?
不,两者的行为不一定相同。
此初始化保证仅运行一次:
static int i = 42; /* Initialisation */
这个作业
static int i = 0;
if (!i) /* line X */
i = 42; /* Assignment */
不是,因为每次程序流到达第 X 行并且 i
等于 0
然后 i
设置为42
(再次)。
例子:
#include <stdio.h>
void foo(int inew)
{
static int i = 42;
printf("%d\n", i);
i = inew;
}
void bar(int inew)
{
static int i = 0;
if (!i)
i = 42;
printf("%d\n", i);
i = inew;
}
int main(void)
{
foo(43);
foo(0);
foo(44);
printf("\n");
bar(43);
bar(0);
bar(44);
return 0;
}
运行它,看看区别:
42
43
0
42
43
42
关于c - 用非常量值初始化静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26717009/
我是一名优秀的程序员,十分优秀!