讨论/《C++ 面试突击》 - static 全局变量和普通全局变量的异同/
《C++ 面试突击》 - static 全局变量和普通全局变量的异同
共 4 个回复

static 函数只在定义该变量的源文件内有效的例子

static void func1(){
    put("func1 is called");
}

/**in another file.c**/
int main(){
    func1(); // undefined reference to func1()
    getchar();
    return 0;
}
1

静态全局变量具有文件作用域。它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被 static 关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。
既然静态全局变量static int a是文件作用域,为什么会在其它文件使用?其它文件再定义static int a那就是另一个变量了吧?

静态局部变量也只初始化一次,这个可以理解。静态局部变量作用域是这个函数体。
int fun()
{
static int i=0;
i++;
return i;
}

当这个函数被反复调用时,i的值是会一直加的,也就是静态局部变量i只被初始化了一次。静态变量的必须初始化,如果没有显示初始化,则初始化为0 ,'0'或者其他。当变量重复时,编译器忽略了重复初始化的代码,这就是静态局部变量只能初始化一次的原因了!

int fun()
{
int i=0;
i++;
return i;
}

反复调用时都返回的是1。虽然i这个变量同名,但是地址是不一样,这是一个新的变量,因为在作用域后,原变量被销毁了.接着创建一个新的变量.
怎么实现只初始化一次:https://zhuanlan.zhihu.com/p/87213810

按理来说所有全局变量都只初始化一次吧

初始化:静态全局变量只初始化一次,防止在其他文件中使用。
这个怎么理解呢