怎么在一个c文件中调用另一个c文件静态全局变量

我在一个c程序文件中定义了一个静态全局变量和一个函数,这个函数用到了这个静态全局变量,而且对这个函数在头文件进行声明,静态全局变量不声明,让其他c文件调用这个函数,为什么可以成功,静态变量不是只能在本文件中调用吗?

这正是全局static变量的用法, 隐藏变量, 防止污染全局空间.
*
函数定义在C文件中, 调用本文件的static变量, 此变量不会被其它C文件看到.
*
而此函数声明在H文件中, 其它含有此头文件的C文件可调用此函数, 此函数调用的static变量仍属于自己的翻译单元, 对外仍然隐藏, 哪怕其它C文件有相同名称的变量, 也不会混淆.

一个文件
int aaa = 123;
另一个文件
extern aaa;
调用
printf("%d", aaa);

包含了头文件相当于把这个函数复制过来了,如果没有包含这个函数声明的头文件,你仅用extern关键字声明是用不了的。

【相关推荐】



  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/909229
  • 这篇博客你也可以参考下:【初级C语言】文件结构(头文件结构,头文件作用,头文件被重复包含的问题)
  • 您还可以看一下 贺利坚老师的C语言及程序设计初步课程中的 简单文字处理小节, 巩固相关知识点
  • 除此之外, 这篇博客: C语言结课大作业(图书馆超市寝室):从文件中读取一个结构体数组和把修改后的结构体数组存入到一个文件中中的 C语言从文件中读取一个结构体数组和把修改后的结构体数组存入到一个文件中 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    本人基础知识不在解释,帖子是我自己编的一个例子,很好理解,尤其是对初学C语言的童鞋,希望大家可以从中了解到用C语言从文件中读取一个结构体数组和把修改后的结构体数组存入到一个文件中

    本例以一个书籍信息的结构体数组为例,包括其书籍编号 书籍名称 作者 类别brand 出版时间(年) 库存量 价格
    代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    
    
    typedef struct /*书籍信息 包含书籍编号 书籍名称  作者 类别brand 出版时间(年)  库存量  价格*/
    {
        int ID;
        char name[100];
        char author[100];
        char brand[100];
        int time;
        int num;
        int price;
    
    }BOOK;
    
    BOOK array[30];
    
    int main()
    {
        FILE *fp = fopen("book.txt", "r");
        int i=0;
    
    
    
        if(fp == NULL)
        {
            printf("can't read data from the book.txt!\n");
            exit(0);
        }
        //打开文件 
        
        while(fscanf(fp,"%d%s%s%s%d%d%d",&array[i].ID,array[i].name,array[i].author,array[i].brand,
                     &array[i].time,&array[i].num,&array[i].price)!=EOF)
        {
            i++;
        }
        fclose(fp);
        
    //***这串代码是从文件book中读取一个结构体数组,注意这个i很重要,表示文件中一共有几个数组,下面要用到***
    
    
        for( int ii = 0; ii < i; ii++)
        {
            if(array[ii].ID != 0)
            printf("ID:%-10d name:%-18s author:%-10s brand:%-8s time:%-5d number:%-5d price:%d\n", array[ii].ID,
                   array[ii].name, array[ii].author, array[ii].brand, array[ii].time, array[ii].num, array[ii].price);
        }
    //***把数组读取出来***
    
        int a;
        printf("请输入你要删除书籍的ID:\n");
        scanf("%d", &a);
    
    
    
        for(int ii = 0; ii < i; ii++)
        {
            if(array[ii].ID == a)
            {
            array[ii].ID = 0;
                break;
            }
        }
    
    //把要删除的书籍ID变成0,下面把结构体数组读取到文件中时如果数组ID为0,则不读取到到文件中,这样这本书籍就删除了
    
         fp = fopen("book.txt", "w"); 
        if(fp == NULL)
        {
            printf("can't read data from the book.txt!\n");
            exit(0);
        }
    //打开文件, 但和上面打开文件不太一样,“w”打开时会把文件中内容全部清空,而上面的“r”不会
    
        for(int iii=0; iii < i ; iii++)
         //iii<i表示只有i-1本书籍信息被存入文件
        {
            if(array[iii].ID != 0) //当书籍ID不为0时把书籍的信息读到文件中
                {
                    fprintf(fp," %d %s %s %s %d %d %d\n",array[iii].ID,
                   array[iii].name, array[iii].author, array[iii].brand, array[iii].time, array[iii].num, array[iii].price);
                }
        }
        getchar();
    
        fclose(fp);
    
    }
    
    

    运行这串代码之前,你需要在你的编程软件创建的文件里里面创建一个文本文档
    在这里插入图片描述
    代码中就是从这个book文件里面读取数据
    在这里插入图片描述
    而book里面你可以输入和上面图片相似的内容。分别代表书籍编号 书籍名称 作者 类别brand 出版时间(年) 库存量 价格

    然后运行代码,最好一行表示一本书籍信息在这里插入图片描述
    然后输入你要删除书籍的ID,点击回车
    在这里插入图片描述
    你再次运行代码
    你会发现你先前输入ID的书籍没了
    **


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^