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

标签 c static static-variables internal-link

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

是否可以访问静态变量?

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

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

作为我的一位 friend 建议我使用以下解决方案。

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 <…>) 之外,还有其他访问静态变量的方法吗。

    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. 如果我对静态变量的概念有误,请纠正我,如果有更好的解决方案可用于访问静态变量?

最佳答案

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

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

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

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

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

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

文件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 - 从一个文件访问静态变量到另一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25009246/

相关文章:

java - 为什么不将每个变量都声明为 Static

c - 我如何决定将 Asterisk 放在哪里?

C 指向返回警告的字符串的指针

c - 在 C DLL 中使用双 * 或短 *,在 C# 中使用 pinvoke 做什么

swift - "let"和 "static let"有什么区别?

iphone - Objective-C - 静态和全局变量?

C - Xcode 中的重定义错误

c# - 通过遗传继承的静态成员可访问性

c# - 编写公共(public)代码的最佳位置是静态帮助类还是基类?

class - JSP EL 内部 JSP 私有(private)静态类