如何在多个文件中使用静态C变量?

Sur*_*dhi 6 c static gcc file

我有两个C文件1.c和2.c.

2.C

#include<stdio.h>

static int i;

int func1(){
   i = 5;
   printf("\nfile2 : %d\n",i);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

1.C

#include<stdio.h>

int i;

int main()
{
   func1();
   printf("\nFile1: %d\n",i);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我用"gcc 1.c 2.c -o st"编译了两个文件,输出如下

file2 : 5

File2: 0
Run Code Online (Sandbox Code Playgroud)

我期待输出如下

file2 : 5

File2: 5
Run Code Online (Sandbox Code Playgroud)

我想在两个文件中访问相同的变量"i".我该怎么做?

Mik*_*ler 12

选择一个将存储变量的文件.不要用static.重点static是保持变量的私密性和其他模块不可触及.

在所有其他文件中,使用extern关键字来引用变量:

extern int i;
Run Code Online (Sandbox Code Playgroud)

  • 静态变量不能从其编译单元外部引用.你需要一个全局变量. (2认同)
  • 静态变量不能跨文件使用.请注意,应用于C变量时的'static'意味着与C++或Java静态成员变量完全不同的东西. (2认同)

Lun*_*din 6

永远不会有理由在另一个文件中访问静态变量.您似乎不知道为什么使用static关键字.在文件范围(外部函数)声明变量有两种方法.

全局变量

int i;
Run Code Online (Sandbox Code Playgroud)

好处:

  • 在整个程序执行期间有效.

缺点:

  • 可以使用extern访问以创建意大利面条代码.
  • "污染"全局命名空间.
  • 不是线程安全的.
  • 在程序启动时初始化,这会产生程序开销.

本地/私人变量

static int i;
Run Code Online (Sandbox Code Playgroud)

好处:

  • 在整个程序执行期间有效.
  • 只能通过相同"模块"/"翻译单元"(相同的.c文件)中的文件访问.
  • 提供私有封装,因为调用者无法访问它.

缺点:

  • 不是线程安全的.
  • 在程序启动时初始化,这会产生程序开销.

我个人认为,没有理由使用全局变量或extern关键字.我已经编程了15年以上,从来没有使用过.我编写了从实时嵌入式系统到Windows GUI绒毛应用程序的所有内容,我从未需要在任何形式的应用程序中使用全局变量.此外,它们在几乎所有已知的C编码标准中都被禁止.