gpt4 book ai didi

c++ - 在不同范围内声明的静态变量之间的区别

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:02:21 24 4
gpt4 key购买 nike

在文件中的 block 内和 block 外声明静态变量有什么区别?例如,在这里,静态变量 a、b、c、d 之间有什么区别?我们能否声明一个可从程序的所有文件访问的静态变量?

    static int a;
void getVol(..)
{
static int b;
}

int main()
{
static int c;
while(condition)
{
static int d;
....
}
some code here;
return 0;
}

最佳答案

最终,没有区别。忽略(暂时)静态成员函数,static 意味着它的意思——但我们在不同的条件下看到它的不同部分,因为它的一些意思也可以在没有关键字的情况下发生。

当您使用 static 关键字时,被定义的对象总是具有:

  1. 静态生命周期——它存在于程序的整个生命周期。
  2. 本地可见性——名称在其声明的范围之外是不可见的。

无论是在 block 内还是 block 外定义的静态变量,这两条都是正确的。一部分或另一部分会默认发生,即使您不使用 static 关键字,但如果您使用该关键字,您总是会同时获得两者。

static 成员函数是类似的,但由于它们是函数,所以它们并不完全具有生命周期——所有函数都具有静态生命周期。静态成员函数具有局部可见性(即,它的名称仅对其类可见)并且有点像“静态生命周期”——该函数未绑定(bind)到类的实例。

对于那些关心 block 级静态变量初始化具体时间的人来说,血淋淋的细节如下(§6.7/4):

The zero-initialization (8.5) of all block-scope variables with static storage duration (3.7.1) or thread storage duration (3.7.2) is performed before any other initialization takes place. Constant initialization (3.6.2) of a block-scope entity with static storage duration, if applicable, is performed before its block is first entered.

An implementation is permitted to perform early initialization of other block-scope variables with static or thread storage duration under the same conditions that an implementation is permitted to statically initialize a variable with static or thread storage duration in namespace scope (3.6.2). Otherwise such a variable is initialized the first time control passes through its declaration; such a variable is considered initialized upon the completion of its initialization.

因此,变量将在程序启动的早期被零初始化。然后,如果指定了其他初始化,则不会晚于执行通过初始化时发生(但也可以早于此发生)。但是请注意,常量初始化和其他初始化之间的区别。举个例子,考虑这样的事情:

int g()  { return 2; }

int f() {
goto bypass;

static int x = 1;
static int y = g();

bypass:

std::cout << x << "\n" << y;
}

这里,x 是常量初始化的,但y 不是。由于 x 是常量初始化的,它在进入 block 时被初始化,所以当我们打印出它的值时,我们应该得到 1。然而,y 初始化的常量,而 goto 意味着执行永远不会经过它的初始化——因此,它将保留 0它在任何其他初始化发生之前被初始化,因此(使用正常运行的编译器)输出将是:

1 
0

关于c++ - 在不同范围内声明的静态变量之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18140552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com