意外的静态计数器变量行为

Posted

技术标签:

【中文标题】意外的静态计数器变量行为【英文标题】:Unexpected static counter variable behaviour 【发布时间】:2017-11-17 01:39:40 【问题描述】:

最近我尝试了解 static 关键字,在这里我尝试简单地将 static 关键字用于函数中的变量声明。像这样:

void counter()                                                                                        
                                                                                                     
    static int counter = 0; //should be initialized only once and once only                           
    counter++; //increment for every call of this function                                            

我知道由于变量是静态的,它将存在于函数之外,因此无论我决定打印计数器,它应该给我函数 counter() 被调用的次数。于是我做了一个简单的测试,如图:

int main()                                                                                            
                                                                                                     
    for(unsigned int i = 0; i < 10; i++)                                                             
        counter();                                                                                    
                                                                                                     
    std::cout << counter << std::endl;                                                                

    return 0;                                                                                         

从这个测试中,我希望得到数字 10...但是返回的代码的计数是 1。

请问,我错过了什么?

我发现了其他“类似”问题的提交,例如: static counter in c++ 但它们主要围绕类中使用的 static 关键字。

【问题讨论】:

std::cout &lt;&lt; counterstd::cout &lt;&lt; counter()。只是一个印刷错误。 静态变量counter只能在函数counter()内访问。在它之外,标识符 counter 指的是函数。 您没有打印counter。看到这个答案***.com/a/2064722/1143634 某物是否“留在内存中”完全独立于对象标识符的范围。 @mira_x 您正在尝试打印函数地址,但不能简单地使用std::ostream 打印,因此它会隐式转换为bool。所以你的代码基本上一直打印true。如果您启用警告-Wall -Wextra,GCC 会警告您。 【参考方案1】:

您在未声明的main() 中打印counter。仅仅因为您在 counter() 中将其声明为 static 并不意味着您可以在 main() 中访问它。

如果你这样做:

void counter() 
    static int counter = 0;
    std::cout << counter++ << std::endl;


int main() 
    for(unsigned int i = 0; i < 10; i++)
        counter();
    
    return 0;

你可以看到计数器在递增。

【讨论】:

【参考方案2】:

countervoid counter() 中仍然是一个local 变量,所以您仍然需要返回它。

【讨论】:

以上是关于意外的静态计数器变量行为的主要内容,如果未能解决你的问题,请参考以下文章

Java声明持久化静态变量

[C++] 智能指针的引用计数如何实现?—— 所有该类的对象共享静态类成员变量

静态局部变量是不好的做法吗?

如何在Javascript中声明一个静态变量[重复]

静态static关键字

分析 CUDA 代码:合并内存读取时出现意外指令计数