在头文件或C源文件中声明全局变量

10

我对包括头文件和变量声明在内的整个过程感到有些困惑。

我正在使用的文件是:main.c,lib.h和lib.c。

main.c

#include "lib.h"

void main(void)
{
    // Code here
    var++;
}

lib.c

#include <avr/io.h>
#include "lib.h"

void light_led(void)
{
    // Code here
}

lib.h

volatile int var;

void light_led(void);

这是制作和包含自己的定制库的正确方式吗?


不是声明,而是定义(这将导致链接器错误)。 - The Paramagnetic Croissant
1个回答

9
你应该在这种情况下使用extern关键字,而不是在头文件中定义全局变量。否则,在操作头文件时,链接器会报错。 lib.c
#include <avr/io.h>
#include "lib.h"

volatile int var;

void light_led(void)
{
//code here
}

lib.h

extern volatile int var;

void light_led(void);

这样,您将在头文件中声明全局变量,在适当的源文件lib.c中定义它。
注意声明和定义变量之间的区别。使用extern关键字可以在不定义变量的情况下提前声明变量。如果您没有在lib.c中定义变量,则尝试使用此变量时会出现错误。因为它只被声明了,而不是实际定义了。
整个static的目的是声明一个变量是私有于所声明的源文件。由于extern关键字连接了另一个源文件中定义的变量,所以它违反了static的目的。extern表示变量具有外部链接性,static表示变量具有内部链接性。标识符不能同时具有内部和外部链接性。
根据MSND的说法:
“当修改变量时,静态关键字指定变量具有静态持续时间(程序开始时分配,程序结束时解除分配),并将其初始化为0,除非指定另一个值。在文件作用域修改变量或函数时,静态关键字指定变量或函数具有内部链接(其名称从声明它的文件之外不可见)。 ”
有关更多信息,请参见下面的链接:
- 理解C语言中的“extern”关键字 - 为什么我们需要C语言中的“extern”关键字

只要你在编辑这个,不要忘记在结尾加上分号。 - Tom Zych
谢谢。我没有意识到原帖中的代码漏掉了一个。 - Tamer Tas
啊,是的,我没有注意到那个。 - Tom Zych
@TamerTas 谢谢您的解释。所以基本上 'extern' 关键字使变量成为全局的,这意味着 'extern' 和 'static' 关键字永远不会一起使用,因为它们的含义相反,对吗? - Ankit
@TamerTas。非常好!谢谢您。 - Ankit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接