8

我最近遇到了一个问题,例如如何将在 file1.c 中声明为静态的变量访问到另一个 file2.c?

是否可以访问静态变量?

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

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

正如我的一位朋友建议我以下解决方案。

file1.c

   #include <stdio.h>

   int main()
   {
          int b=foo();
          printf("%d",b);
          return 0;
   }

file2.c

   static int a=25;

   int foo()
   {
        return a;
   }

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

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

所以我的问题是:

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

  2. 如果不是,为什么会这样,除了包括文件()之外,还有其他方法可以访问静态变量#include <…&gt;

    如何从另一个文件访问静态变量?

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

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

4

4 回答 4

9

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

不,您没有违反任何规则。这里 foo 函数创建该静态变量的值的副本并在其他文件中使用。没关系。

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

静态变量仅意味着仅在该文件中使用。

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

另一个肮脏的技巧是获取该静态变量的指针并将其作为全局指针并将其作为另一个文件中的外部指针,您可以使用该静态变量。

文件1.c

 #include<stdio.h>
  static int a=25;
  int* ptr = &a;

文件2.c

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

   int main()
   {
          printf("%d",*ptr);
          return 0;
   }

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

  1. 静态变量的生命周期跨越程序的整个运行

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

  3. 静态变量的范围仅限于其文件。您不能从其他文件按名称访问它。

  4. 您将 temp1.c 和 temp2.​​c 一起编译,然后您也可以在两个文件中拥有同名的静态变量 - 它们是单独的变量。

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

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

于 2014-07-29T06:44:35.957 回答
4

我们在 C 中通常所说的变量实际上是两件事:一个object,为使用某种类型解释的变量分配的内存,以及一个identifier,一种访问该对象的方式。

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

具有内部链接只涉及标识符,名称a。这个只在里面可见file2.c

于 2014-07-29T07:22:41.907 回答
0

static int a=25;变量a会有内部联系;这意味着链接器无法看到TUa之外的任何地方。file2.c

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

定义文件

该文件既声明又定义变量;另外也将其初始化为 1,否则默认初始化为 0。

// (non-static) global variable with external linkage and thus visible across TUs
int var_across = 0;
void use()
{
   var_across = 1;
}

使用文件

// just a declaration to tell that it's defined elsewhere; not a definition
extern int var_across;
void use_here()
{
   var_across = 2;
}
于 2014-07-29T06:19:56.690 回答
0

将静态变量的地址分配给指针将使静态变量可用于子文件。

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

但没有必要这样做。

于 2016-07-08T05:31:14.817 回答