如何在不同的.c文件之间共享变量?

64 c

关于C声明的初学者问题:

在.c文件中,如何使用另一个.c文件中定义的变量?

Ric*_*dle 125

在fileA.c中:

int myGlobal = 0;
Run Code Online (Sandbox Code Playgroud)

在fileA.h中

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

在fileB.c中:

#include "fileA.h"
myGlobal = 1;
Run Code Online (Sandbox Code Playgroud)

这就是它的工作原理:

  • 变量存在于fileA.c中
  • fileA.h告诉全世界它存在,它的类型是什么(int)
  • fileB.c包含fileA.h,以便编译器在fileB.c尝试使用它之前知道myGlobal.

  • @jfq:非类上下文中的"静态"意味着"仅限于此翻译单元".它基本上与"外部"相反.你不能同时拥有两者. (12认同)
  • @arbitter:没有头文件,你不能共享变量(除非你把`extern int myGlobal;`直接放到想要访问`myGlobal`的源文件中,但这是对DRY的恶意攻击).如果你需要从main.c共享一个全局,*create*main.h! (2认同)

Jef*_*ffP 10

如果变量是:

int foo;
Run Code Online (Sandbox Code Playgroud)

在第二个C文件中,您声明:

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


Tha*_*tos 9

  1. 尽量避免使用全局变量.如果必须使用全局,请参阅其他答案.
  2. 将它作为参数传递给函数.

  • @Thanatos这不是什么"令人难以置信".除非你认为嵌入式开发的广泛世界是初学者永远不会询问的东西,否则你的答案太狭隘和具体.如果存在这样的事情,除了你明显认为C的正常使用之外,还有许多其他原因可以使用全局变量.最后,在OP的问题中绝对没有背景,因此关于它的广泛陈述是一个假设.OP很可能一直在询问中断. (6认同)
  • 你如何处理中断呢?假设中断被触发并且我想读取引脚上的值,如何在不将其写入全局变量的情况下返回该值? (5认同)
  • @Thanatos,当人们说事情应该/应该/以某种方式不说为什么的时候,这真的让我很生气,这对任何阅读它的人来说都是毫无价值的信息,如果有该功能,那么就打算使用它。 (2认同)

Lun*_*din 7

在99.9%的情况下,在文件之间共享非常量全局变量是不好的程序设计.实际需要这样做的情况非常少:它们非常罕见,我无法提出任何有效案例.也许是硬件寄存器的声明.

在大多数情况下,您应该使用(可能是内联的)setter/getter函数("public"),文件范围的静态变量("private")或不完整的类型实现("private").

在极少数情况下,当您需要在文件之间共享变量时,请执行以下操作:

// file.h
extern int my_var;

// file.c
#include "file.h"
int my_var = something;

// main.c
#include "file.h"
use(my_var);
Run Code Online (Sandbox Code Playgroud)

切勿将任何形式的变量定义放在h文件中.

  • 考虑到您夸大了全局变量的有效案例是多么罕见,您的帖子太固执己见了。在我的脑海中,控制嵌入式系统中资源可用性的二进制信号量必须是全局的。任何共享资源的基于 RTOS 的固件都将充斥着全局信号量。同样,当全局代表真正应该随处可用的东西时,它在速度和开发方面都可以更简单、更快。此外,单例基本上是带有一些语法糖的全局变量。过于简单化?是的,但概念上有效。 (2认同)