C 将静态变量从一个文件访问到另一个文件

C 将静态变量从一个文件访问到另一个文件,c,static,static-variables,internal-link,C,Static,Static Variables,Internal Link,我最近遇到了一个问题,比如如何将file1.c中声明为static的变量访问到另一个file2.c 可以访问静态变量吗 我对C中静态关键字的理解是 static是“内部链接”,因此只能从一个编译单元(定义它们的单元)访问它们。使用内部链接声明的对象对于单个模块是私有的 正如我的一位朋友在下面建议我的解决方案 在file1.c中 #include <stdio.h> int main() { int b=foo(); prin

我最近遇到了一个问题,比如如何将file1.c中声明为static的变量访问到另一个file2.c

可以访问静态变量吗

我对C中静态关键字的理解是

static
是“内部链接”,因此只能从一个编译单元(定义它们的单元)访问它们。使用内部链接声明的对象对于单个模块是私有的

正如我的一位朋友在下面建议我的解决方案

file1.c中

   #include <stdio.h>

   int main()
   {
          int b=foo();
          printf("%d",b);
          return 0;
   }
由gcc file1.c file2.c-o文件编译

如果我执行上述操作,我可以访问变量

因此,我的问题是:

  • 上述程序是否违反了静态变量规则

  • 如果不是,为什么会这样,除了include file(
    #include
    )之外,还有其他方法访问静态变量吗

  • 如果我对静态变量的概念有错误,如果有更好的解决方案可以访问静态变量,请纠正我的错误


  • 静态int a=25时变量
    a
    将具有内部链接;这意味着链接器无法看到
    a
    文件2.c
    之外的任何地方

    当你在
    file2.c
    中调用
    foo()
    时,你会得到一份
    a
    ,这是你打印的副本;但这并不意味着您可以访问
    file2.c
    中定义的实际
    a
    ,当您需要在不同的TU中可以看到相同变量时,您可以这样做

    定义文件 该文件声明并定义变量;此外,还将其初始化为1,没有该值,它将默认初始化为0

    // (non-static) global variable with external linkage and thus visible across TUs
    int var_across = 0;
    void use()
    {
       var_across = 1;
    }
    
    使用文件 1)上述程序是否违反了静态变量规则?

    不,你没有遵守任何规则。在这里,foo函数创建该静态变量值的副本,并在其他文件中使用。很好

    2)如果不是,为什么会这样?除了包含文件(#include)之外,还有其他方法访问静态变量吗?不像这样,我怎样才能从另一个文件访问静态变量?

    静态变量只能在该文件中使用

    不能使用该变量使它们在其他文件中成为外部变量

    另一个棘手的问题是获取该静态变量的指针,并将其作为全局指针,并将其作为另一个文件中的extern,您可以使用该静态变量

    文件1.c

     #include<stdio.h>
      static int a=25;
      int* ptr = &a;
    
    #包括
    静态INTA=25;
    int*ptr=&a;
    
    文件2.c

    #include<stdio.h>
    extern int *ptr;
    
       int main()
       {
              printf("%d",*ptr);
              return 0;
       }
    
    #包括
    外部内部*ptr;
    int main()
    {
    printf(“%d”,*ptr);
    返回0;
    }
    
    如果我对静态变量概念有错误,并且有更好的解决方案,请纠正我?

  • 静态变量的生存期在整个程序运行期间都会延长

  • 如果不使用某个值初始化静态变量,则其默认值为0

  • 静态变量的作用域仅限于其文件。您不能从其他文件按名称访问它

  • temp1.c和temp2.c都在一起编译,然后两个文件中都可以有相同名称的静态变量,它们是独立的变量

  • 在C语言中,如何将全局变量的作用域限制在声明它的文件中?


    通过将全局变量设为静态变量。

    在C中我们通常称之为变量的实际上是两件事:一个对象,分配给变量的内存,用某种类型解释;一个标识符,访问该对象的一种方法

    从另一个编译单元访问
    静态
    对象或其值没有问题。您的函数
    foo
    将值提升到另一个单位,这很好,但它甚至可以毫无问题地提升
    a
    的地址


    具有内部链接只涉及标识符,即名称
    a
    。只有在
    file2.c
    中将静态变量的地址分配给指针时,才会使静态变量对子文件可用

    在子文件中,我们必须对指针使用extern关键字


    但没有必要这样做

    使用static关键字,我需要访问-1使extern int a您无法访问file1.c.@Mr.32中的static int a。请正确阅读答案。我说,
    a
    将具有内部链接,因此链接器无法看到它,这意味着相同。此外,我还编写了删除
    静态
    将使其与
    外部
    一起工作。这个答案与所使用的OP
    extern inta
    file1.c
    中。您应该更新您的答案,澄清“我已经编写了删除静态将使其与外部工作”,以便我可以向上投票you@Mr.32同意,我明白了。现在修复它以匹配更改的问题。您从未在file1.c中使用过
    a
    。我认为,如果您试图访问它,编译器应该抛出错误。您没有违反任何规定,也没有在翻译单元(它是静态的)之外“访问”
    a
    。您有一个按值返回
    a
    的函数。如果您需要在
    file2.c
    之外对其进行修改,或者通过函数返回其地址,或者提供函数get/set api.IDK这里“更好”的含义是什么,但是您可以编写
    int*foo(){return&a;}
    @vinayhunachyal是的,这是可能的。32先生给出了一种方法,我的评论给出了另一种方法。这是一个意见的问题,哪一个是“更好的”注意,
    static
    隐藏了名称;不能使用该名称从定义静态变量的转换单元(TU)外部访问该变量。另一个TU中可能存在另一个同名变量,但这将是一个单独的变量。但是static只隐藏名称。指针可以被传递,以使变量
     #include<stdio.h>
      static int a=25;
      int* ptr = &a;
    
    #include<stdio.h>
    extern int *ptr;
    
       int main()
       {
              printf("%d",*ptr);
              return 0;
       }