35

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;
}
4

7 回答 7

38

区别在于:

  • 该名称只能在函数内访问,并且没有链接。
  • 它在执行第一次到达定义时被初始化,不一定在程序的初始化阶段。

第二个区别对于避免静态初始化顺序惨败很有用,其中全局变量可以在初始化之前访问。通过将全局变量替换为返回对局部静态变量的引用的函数,您可以保证在任何访问它之前对其进行初始化。(但是,仍然不能保证在任何东西完成访问它之前它不会被销毁;如果您认为您需要一个全局可访问的变量,您仍然需要非常小心。请参阅评论以获取在这种情况下提供帮助的链接。 )

于 2012-08-29T21:38:52.510 回答
9

他们的范围不同。文件中的任何函数都可以访问全局范围的静态变量,而函数范围的变量只能在该函数内访问。

于 2012-08-29T21:37:54.297 回答
6

希望这个例子有助于理解静态局部变量和全局变量之间的区别。

#include <iostream>

using namespace std;

static int z = 0;

void method1() {
    static int x = 0;
    cout << "X : " << ++x << ", Z : " << ++z << endl;
}

void method2() {
    int y = 0;
    cout << "Y : " << ++y << ", Z : " << ++z << endl;
}

int main() {
    method1();
    method1();
    method1();
    method1();
    method2();
    method2();
    method2();
    method2();
    return 0;
}

输出:

X : 1, Z : 1
X : 2, Z : 2
X : 3, Z : 3
X : 4, Z : 4
Y : 1, Z : 5
Y : 1, Z : 6
Y : 1, Z : 7
Y : 1, Z : 8
于 2017-03-24T10:07:24.580 回答
4

有真名是:

static storage duration object.

全局变量也是“静态存储持续时间对象”。与全局变量的主要区别是:

  • 它们在第一次使用之前不会被初始化
    注意:构造过程中的异常意味着它们没有被初始化,因此没有被使用。
    所以下次输入该函数时会重试。
  • 它们的可见性受到其范围的限制
    (即在函数之外无法看到它们)

除此之外,它们就像其他“静态存储持续时间对象”一样。

注意:像所有“静态存储持续时间对象”一样,它们以与创建相反的顺序被销毁。

于 2012-08-29T21:38:42.190 回答
2

主要或最严重的区别是初始化时间。局部静态变量在第一次调用声明它们的函数时被初始化。全局变量在调用 main 函数之前的某个时间点初始化,如果全局静态变量很少,它们会以未指定的顺序初始化,这可能会导致问题;这被称为静态初始化惨败。

于 2012-08-29T21:40:16.207 回答
0

在您的第一个代码块中,x 是 foo() 函数的本地函数,这意味着它是在 foo() 中创建的,并在函数结束时在 cout 之后销毁。但是,在您的第二个块中, x 是全局的,这意味着 x 的范围是整个程序。如果你想在 int main 下你可以 cout << x << endl 但是它会打印,在第一个块中它会说 x 没有声明

于 2012-08-29T21:40:18.700 回答
0
  1. 程序中的所有函数都知道它们,而全局变量只在有限的范围内知道。
  2. 全局静态变量可以在程序启动之前初始化,而局部静态变量可以在执行到达点时初始化。
于 2016-11-17T07:42:05.193 回答