C 静态作用域变量未定义

C static scope variable undefined

我的目标是添加(不修改任何现有代码)一个函数 retrieve(),其中 returns 计数器的当前值。

#include <stdio.h>

void increment(void){
    static unsigned int counter = 0;

    counter++;

    printf("%d\n", counter);

}

int main(void){

    for (int i = 0; i < 5; i++){
        increment();
    }
    
    printf("counter = %d\n", retrieve()); 

    return 0;
}

但是,我尝试的一切都是 运行 范围问题。即 counter 尚未实例化,因此编译器认为它是未定义的名称。我试过添加一个函数

int retrieve(void){

    return counter;
}

incrementmain 之间,也在 incrementmain 之间。我对 static 关键字的理解是,一旦变量被实例化,它将在程序执行期间持续超出其定义的块。所以我认为我 运行 遇到的问题是变量尚未实例化。任何帮助都会很棒。

您需要将计数器移至全局范围

#include <stdio.h>
static unsigned int counter = 0; <<<=========
void increment(void){
   

    counter++;

    printf("%d\n", counter);

}
int retrieve(void){

    return counter;
}
int main(void){

    for (int i = 0; i < 5; i++){
        increment();
    }
    
    printf("counter = %d\n", retrieve()); 

    return 0;
}

公认的最佳做法是在名称中指明其全局

 unsigned int COUNTER = 0;

 unsigned int g_counter = 0;

范围和生命周期是两个不同的东西,它们部分独立。

范围是标识符可见的程序文本区域。

生命周期(或存储持续时间)是程序执行期间对象存在的持续时间。

名为counter的对象,因为它是用static定义的,具有静态存储持续时间,这意味着它在整个执行过程中都存在程序。但是标识符 counter 具有 块作用域 ,这意味着该名称仅从其声明到终止声明它的最内层块的 } 可见。 (在这种情况下,该块恰好是函数定义的最外层块。)