静态局部变量和静态全局变量有什么区别?

问题描述 投票:0回答:7

C++ 入门说

每个局部静态变量在第一次之前都会被初始化 执行通过对象的定义。本地静态数据是 函数结束时不会被销毁;当程序运行时它们被销毁 终止。

局部静态变量与全局静态变量有什么不同吗?除了申报地点之外,还有什么不同?

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;
}
c++ static global-variables
7个回答
43
投票

差异是:

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

第二个区别有助于避免“静态初始化顺序失败”,即可以在初始化之前访问全局变量。通过用返回局部静态变量引用的函数替换全局变量,您可以保证它在任何访问它之前被初始化。 (但是,仍然不能保证在任何内容完成访问它之前它不会被销毁;如果您认为需要一个全局可访问的变量,您仍然需要非常小心。请参阅 link 的注释以提供帮助情况。)


10
投票


8
投票

#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



5
投票

static storage duration object.

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

它们直到第一次使用才初始化
    注意:构造过程中出现异常意味着它们没有初始化,因此没有使用。
  • 所以下次进入该功能时它会重试。

    他们的可见性受到其范围的限制
  • (即在函数之外看不到它们)

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

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


2
投票


0
投票

<< x << endl and it would print however, in the first block it would say x not declared


0
投票
程序中的所有函数都知道它们,而全局函数则知道它们 变量仅在有限范围内已知。
  1. 全局静态变量可以在程序启动之前初始化,而局部静态变量可以在执行到达点时初始化。
© www.soinside.com 2019 - 2024. All rights reserved.