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;
}
在 increment
和 main
之间,也在 increment
和 main
之间。我对 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
具有 块作用域 ,这意味着该名称仅从其声明到终止声明它的最内层块的 }
可见。 (在这种情况下,该块恰好是函数定义的最外层块。)
我的目标是添加(不修改任何现有代码)一个函数 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;
}
在 increment
和 main
之间,也在 increment
和 main
之间。我对 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
具有 块作用域 ,这意味着该名称仅从其声明到终止声明它的最内层块的 }
可见。 (在这种情况下,该块恰好是函数定义的最外层块。)