c++ 静态局部变量和静态全局变量的区别是什么?

gc0ot86w  于 2023-10-21  发布在  其他
关注(0)|答案(7)|浏览(110)

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;
}
1cosmwyk

1cosmwyk1#

区别在于:

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

第二个区别可以用来避免 * 静态初始化顺序失败 *,其中全局变量可以在初始化之前访问。通过用一个返回局部静态变量引用的函数替换全局变量,可以保证在任何东西访问它之前初始化它。(然而,仍然不能保证它不会在任何东西完成访问之前被破坏;如果你认为你需要一个全局可访问的变量,你仍然需要非常小心。在这种情况下,请参阅link的注解。)

ilmyapht

ilmyapht2#

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

fzwojiic

fzwojiic3#

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

#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
2uluyalo

2uluyalo4#

有真实的名字是:

static storage duration object.

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

  • 它们直到第一次使用时才初始化

注意:构造期间的异常意味着它们没有初始化,因此没有使用。
因此,它将在下次输入该函数时重试。

  • 它们的可见性受到其范围的限制

(ie不能在函数外看到)
除此之外,它们就像其他“静态存储持续时间对象”一样。
注意:像所有的“静态存储持续时间对象”一样,它们以与创建相反的顺序被销毁。

pkmbmrz7

pkmbmrz75#

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

jchrr9hc

jchrr9hc6#

在第一个代码块中,x是foo()函数的本地值,这意味着它是在foo()中创建的,并在cout之后的函数末尾销毁。然而,在第二个块中,x是全局的,这意味着x的作用域是整个程序。如果你想在int main下,你可以cout << x << endl,它会打印出来,但是,在第一个块中,它会说x没有声明

t98cgbkg

t98cgbkg7#

1.它们对程序中的所有函数都是已知的,而全局变量只在有限的范围内是已知的。
1.全局静态变量可以在程序启动之前初始化,而局部静态变量可以在执行到达点时初始化。

相关问题