【问题标题】:Access of static variable from one file to another file从一个文件访问另一个文件的静态变量
【发布时间】:2014-09-20 11:12:42
【问题描述】:

我最近遇到了一个问题,比如如何将在 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 &lt;…&gt;)之外,还有其他方法可以访问静态变量。

    How am I able to access a static variable from another file?

    In C, how do I restrict the scope of a global variable to the file in which it's declared?

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

【问题讨论】:

  • 您从未在 file1.c 中使用过a。我认为如果您尝试访问它,编译器应该会抛出错误。
  • 您没有违反任何规定,也没有在静态的翻译单元之外“访问”a。您有一个按值返回 a 的函数。如果您需要在file2.c 之外修改它,请通过函数返回其地址或提供功能性 get/set api。
  • IDK 这里的“更好”应该是什么意思,但你可以写int *foo() { return &amp;a; }
  • @vinayhunachyal 是的,这是可能的。 32 先生给出了一种方法,而我的评论给出了另一种方法。哪个“更好”是一个见仁见智的问题
  • 注意static隐藏了名字;您不能使用该名称从定义静态变量的翻译单元 (TU) 外部访问该变量。另一个同名变量可能存在于另一个 TU 中——但这将是一个单独的变量。但静态只隐藏名称。可以传递指针以使变量可访问——它只是完全隐藏的名称。但只有定义了静态变量的 TU 中的代码才能提供对变量的访问;文件外的普通代码无法通过名称访问变量。

标签: c static static-variables internal-link


【解决方案1】:

static int a=25; 变量a 将具有内部链接;这意味着链接器在file2.c TU 之外的任何地方都看不到a

当您在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;
}

使用文件

// just a declaration to tell that it's defined elsewhere; not a definition
extern int var_across;
void use_here()
{
   var_across = 2;
}

【讨论】:

  • 带有我需要访问的静态关键字
  • -1 使 extern int a 无法访问 file1.c 中的 static int a。
  • @Mr.32 请正确阅读答案。我说a 会有内部链接,因此链接器看不到它,意思是一样的。我还写过删除static 将使其与extern 一起使用。此答案与file1.c 中使用的extern int a;first edit of the question 有关。
  • 你应该更新你的答案,澄清“我写的删除静态将使它与外部一起工作”,这样我就可以投票给你
  • @Mr.32 同意,要点。现在修复它以匹配更改的问题。
【解决方案2】:

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

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

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

静态变量仅用于该文件。

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

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

file1.c

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

file2.c

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

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

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

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

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

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

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

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

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

【讨论】:

  • 有没有更好的方法来访问其他文件中的静态变量?
  • 我说过静态并不意味着在其他文件中使用它。如果您想这样做,为什么要将该变量设为静态?只需删除静态单词并在另一个文件中访问它,只需添加 extern int a。
  • 你仍然想访问另一个文件中的静态变量然后另一个肮脏的黑客是获取该静态变量的指针并将其作为全局指针并将其作为另一个文件中的外部指针,您可以使用该静态变量.
  • @vinayhunachyal 我已经更新了用于从其他文件访问静态的代码。
【解决方案3】:

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

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

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

【讨论】:

  • 是否有更好的解决方案来访问其他文件中的静态变量?除了我上面提到的
【解决方案4】:

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

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

但没有必要这样做。

【讨论】:

    猜你喜欢
    • 2014-02-27
    • 1970-01-01
    • 2011-01-19
    • 2010-12-30
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 2011-01-14
    • 2012-09-06
    相关资源
    最近更新 更多