C++ Primer说:
每个局部静态变量在第一次执行通过对象的定义之前被初始化。当函数结束时,局部静校正不会被破坏;它们在程序终止时被销毁。
局部静态变量与全局静态变量有什么不同吗?除了声明的位置,还有什么不同?
void foo () {
static int x = 0;
++x;
cout << x << endl;
}
int main (int argc, char const *argv[]) {
foo(); // 1
foo(); // 2
foo(); // 3
return 0;
}
比较
static int x = 0;
void foo () {
++x;
cout << x << endl;
}
int main (int argc, char const *argv[]) {
foo(); // 1
foo(); // 2
foo(); // 3
return 0;
}
7条答案
按热度按时间1cosmwyk1#
区别在于:
第二个区别可以用来避免 * 静态初始化顺序失败 *,其中全局变量可以在初始化之前访问。通过用一个返回局部静态变量引用的函数替换全局变量,可以保证在任何东西访问它之前初始化它。(然而,仍然不能保证它不会在任何东西完成访问之前被破坏;如果你认为你需要一个全局可访问的变量,你仍然需要非常小心。在这种情况下,请参阅link的注解。)
ilmyapht2#
他们的范围是不同的。全局作用域的静态变量可以被文件中的任何函数访问,而函数作用域的变量只能在该函数内访问。
fzwojiic3#
希望这个例子能帮助理解静态局部变量和全局变量之间的区别。
产出:
2uluyalo4#
有真实的名字是:
全局变量也是“静态存储持续时间对象”。与全局变量的主要区别是:
注意:构造期间的异常意味着它们没有初始化,因此没有使用。
因此,它将在下次输入该函数时重试。
(ie不能在函数外看到)
除此之外,它们就像其他“静态存储持续时间对象”一样。
注意:像所有的“静态存储持续时间对象”一样,它们以与创建相反的顺序被销毁。
pkmbmrz75#
主要或最严重的区别是初始化的时间。局部静态变量在第一次调用声明它们的函数时初始化。全局变量在调用main函数之前的某个时间点初始化,如果你有几个全局静态变量,它们会以未指定的顺序初始化,这可能会导致问题;这被称为静态初始化失败。
jchrr9hc6#
在第一个代码块中,x是foo()函数的本地值,这意味着它是在foo()中创建的,并在cout之后的函数末尾销毁。然而,在第二个块中,x是全局的,这意味着x的作用域是整个程序。如果你想在int main下,你可以cout << x << endl,它会打印出来,但是,在第一个块中,它会说x没有声明
t98cgbkg7#
1.它们对程序中的所有函数都是已知的,而全局变量只在有限的范围内是已知的。
1.全局静态变量可以在程序启动之前初始化,而局部静态变量可以在执行到达点时初始化。