c – 在不同范围内声明的静态变量之间的差异

在块内声明静态变量和在文件中的块外部之间有什么区别?例如,这里,静态变量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关键字,但如果使用关键字,则始终同时获得这两部分.

静态成员函数是类似的,但由于它们是函数,它们并不完全具有生命周期 – 所有函数都具有静态生命周期.静态成员函数具有本地可见性(即,其名称仅在其类中可见)并且类似于“静态生存期” – 该函数未绑定到类的实例.

编辑:对于那些关心块级静态变量初始化的特定时间的人,血淋淋的细节如下(§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是常量初始化的,它在进入块时被初始化,所以当我们打印出它的值时,我们应该得到1. y,但是,不是常量初始化,而goto意味着执行永远不会流经其初始化 – 因此,在任何其他初始化发生之前,它将保留它初始化的0,因此(使用正常运行的编译器)输出将是:

1 
0

转载注明原文:c – 在不同范围内声明的静态变量之间的差异 - 代码日志