我最近遇到了一个问题,比如如何访问在file1中声明为static的变量。c到另一个文件2。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. 如果没有,为什么会这样,除了包括file(#include <…>)不是这样的。

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

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

  3. 纠正我,如果我错了静态变量的概念,如果有任何更好的解决方案可用于访问静态变量?

有帮助吗?

解决方案

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 中,如何将全局变量的范围限制在声明它的文件中?

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

其他提示

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

访问a没有问题 static 对象 或其来自另一编译单元的值。您的功能 foo 将值提升到另一个单位,这很好,但它甚至可以提升 a 没有问题。

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

static int a=25; 变量 a 会有内部联动;意思是链接器看不到 a 外的任何地方 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;
}

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

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

但没有必要这样做。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top