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

时间:2014-06-17 10:23:14

标签: c header-files

我对整个问题感到困惑,包括头文件和变量声明。

我使用的文件是: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);

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

1 个答案:

答案 0 :(得分: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

  

当修改变量时,static关键字指定变量具有静态持续时间(在程序开始时分配,在程序结束时释放)并将其初始化为0,除非指定了另一个值。 在文件范围内修改变量或函数时,static关键字指定变量或函数具有内部链接(其名称在声明它的文件外部不可见)。

有关详细信息,请查看以下内容: