C 静态范围变量未定义



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

#include <stdio.h>
void increment(void){
static unsigned int counter = 0;
counter++;
printf("%dn", counter);
}
int main(void){
for (int i = 0; i < 5; i++){
increment();
}

printf("counter = %dn", retrieve()); 
return 0;
}

但是,我尝试的所有内容都遇到了范围问题。也就是说,counter尚未实例化,因此编译器将其视为未定义的名称。我试过添加一个函数

int retrieve(void){
return counter;
}

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

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

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

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

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

您需要将计数器移动到全局范围内

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

counter++;
printf("%dn", counter);
}
int retrieve(void){
return counter;
}
int main(void){
for (int i = 0; i < 5; i++){
increment();
}

printf("counter = %dn", retrieve()); 
return 0;
}

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

unsigned int COUNTER = 0;

unsigned int g_counter = 0;

最新更新