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

vin*_*yal 7 c static static-variables internal-link

我最近遇到的问题是如何访问一个在file1.c中声明为static的变量到另一个file2.c?

是否可以访问静态变量?

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

static是"内部链接",因此只能从一个编译单元访问它们 - 它们被定义的单元.使用内部链接声明的对象是单个模块的私有对象.

正如我的一位朋友建议我解决方案.

file1.c

   #include <stdio.h>

   int main()
   {
          int b=foo();
          printf("%d",b);
          return 0;
   }
Run Code Online (Sandbox Code Playgroud)

file2.c

   static int a=25;

   int foo()
   {
        return a;
   }
Run Code Online (Sandbox Code Playgroud)

汇编 gcc file1.c file2.c -o file

如果我在上面,我可以访问变量.

所以我的问题是:

  1. 上述程序是否违反静态变量规则?

  2. 如果没有,为什么会这样,除了包括file(#include <…>)之外,还有其他方法可以访问静态变量.

    我怎么能从另一个文件访问静态变量?

    在C中,如何将全局变量的范围限制为声明它的文件?

  3. 如果我对静态变量概念有误,并且有更好的解决方案可用于访问静态变量,请纠正我?

Jee*_*tel 8

1)上述程序是否违反静态变量规则?

不,你不是在破坏任何规则.这里foo函数创建该静态变量的值的副本并在其他文件中使用.没关系.

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

静态变量仅表示仅在该文件中使用.

你不能使用那个变量使它们在其他文件中extern.

另一个肮脏的黑客是获取该静态变量的指针并将其作为全局指针,并将其作为另一个文件中的extern,您可以使用该静态变量.

在file1.c

 #include<stdio.h>
  static int a=25;
  int* ptr = &a;
Run Code Online (Sandbox Code Playgroud)

file2.c中

#include<stdio.h>
extern int *ptr;

   int main()
   {
          printf("%d",*ptr);
          return 0;
   }
Run Code Online (Sandbox Code Playgroud)

如果我对静态变量概念有错并且是否有更好的解决方案,请纠正我?

  1. 静态变量的生命周期延伸到整个程序运行

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

  3. 静态变量的范围仅限于其文件.您无法通过其他文件中的名称访问它.

  4. 你有temp1.c和temp2.​​c都被编译在一起然后你也可以在两个文件中都有相同名称的静态变量 - 它们是单独的变量.

在C中,如何将全局变量的范围限制为声明它的文件?

通过将该全局变量设为静态变量.


Jen*_*edt 6

我们在 C 中通常所说的变量实际上是两个东西:一个对象(为用某种类型解释的变量分配的内存)和一个标识符(访问该对象的一种方式)。

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

Having internal linkage only concerns the identifer, the name a. This one is only visible inside file2.c.