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

时间:2012-08-29 21:34: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;
}

比较
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 个答案:

答案 0 :(得分:26)

区别在于:

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

第二个区别对于避免静态初始化顺序惨败非常有用,其中全局变量可以在初始化之前被访问。通过用返回对本地静态变量的引用的函数替换全局变量,可以保证在访问它之前初始化它。 (但是,仍然无法保证在完成访问之前它不会被销毁;如果您认为需要全局可访问的变量,仍需要非常小心。请参阅link的注释以帮助在那种情况下。)

答案 1 :(得分:7)

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

答案 2 :(得分:6)

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

    Pattern r = Pattern.compile("\\[\"(.*?)\"\\]");

输出:

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

答案 3 :(得分:4)

真名是:

static storage duration object.

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

  • 直到第一次使用时才初始化 注意:施工期间的例外意味着它们未被初始化,因此未被使用 所以它会在下次输入函数时重新尝试。
  • 他们的可见性受其范围的限制 (即在功能之外无法看到它们)

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

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

答案 4 :(得分:2)

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

答案 5 :(得分:0)

在你的第一个代码块中,x是foo()函数的本地,这意味着它是在foo()中创建的,并在cout之后的函数末尾被销毁。但是,在第二个块中,x是全局的,这意味着x的范围是整个程序。如果你想在int main下你可以cout&lt;&lt; x&lt;&lt;然而,它将打印出来,在第一个块中它会说x未声明

答案 6 :(得分:0)

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