关于C++中的局部和全局静态变量

Jam*_*sev 24 c++ static

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;
}
Run Code Online (Sandbox Code Playgroud)

与之比较

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;
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 28

不同之处是:

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

第二个差异可以用于避免静态初始化顺序惨败,其中全局变量可以在初始化之前被访问.通过用返回对本地静态变量的引用的函数替换全局变量,可以保证在访问它之前初始化它.(但是,仍然无法保证在完成任何操作之前它不会被销毁;如果您认为需要一个全局可访问的变量,您仍需要非常小心.请参阅注释以获取有关该情况的帮助链接. )


Ric*_*ket 7

它们的范围不同.全局范围的静态变量可供文件中的任何函数访问,而函数范围的变量只能在该函数中访问.


emo*_*mon 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)


Mar*_*ork 5

真实姓名是:

static storage duration object.
Run Code Online (Sandbox Code Playgroud)

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

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

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

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