C静态范围变量未定义

C静态范围变量未定义,c,scope,C,Scope,我的目标是添加(不修改任何现有代码)一个函数retrieve(),该函数返回计数器的当前值 #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++){

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

#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;
}

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;
}


范围和生命周期是两个不同的东西,它们在一定程度上是独立的

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

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


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

它可能具有静态存储持续时间,但仅在
增量中可见(块范围)-您无法在任何其他函数中访问它,因此我必须在
increment
中定义我的函数,然后才能正常工作?您不能在C中的其他函数中定义函数。您很可能希望在文件范围中使用
counter
,而不是Yes,你需要使计数器成为全局的。你对静态的理解是正确的,但是你忽略了范围。如果在函数中声明变量,则作用域也仅限于该函数。在您的例子中,您希望有一个位于翻译单元(c文件)范围内的静态变量。因此,您需要将静态变量的声明移到函数外部,然后才能从*.c文件中的所有函数访问它。OP不修改现有代码的约束不允许通用解决方案。因此,可能可以接受对代码进行最小程度的修改。
计数器
不需要全局作用域:它只需要(附加)修改功能即可访问。对您的提案进行小评论。只要变量只在该文件中使用,最好将其声明为静态,以便在实际不需要时不导出符号。我的经验是,所有大写名称都用于宏和常量。我从来没有见过一种编码风格会将其用于变量,全局变量或其他变量。@NateEldredge我去过rust land,它的所有大写字母都在那里
#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;