我的目标是添加(不修改任何现有代码)一个返回计数器当前值的函数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;
}
在increment
和main
之间,也在increment
和main
本身之间。我对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;