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

Ank*_*kit 10 c header-files

我有点困惑整个包括头文件和变量声明.

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

main.c中

#include "lib.h"

void main(void)
{
    // Code here
    var++;
}
Run Code Online (Sandbox Code Playgroud)

lib.c

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

void light_led(void)
{
    // Code here
}
Run Code Online (Sandbox Code Playgroud)

lib.h

volatile int var;

void light_led(void);
Run Code Online (Sandbox Code Playgroud)

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

Tam*_*Tas 9

您应该extern为这种情况使用关键字,而不是在标头中定义全局变量.否则,链接器将在对头文件进行操作时抛出错误.

lib.c

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

volatile int var;

void light_led(void)
{
//code here
}
Run Code Online (Sandbox Code Playgroud)

lib.h

extern volatile int var;

void light_led(void);
Run Code Online (Sandbox Code Playgroud)

这样,您将在标头中声明全局变量,并在相应的源文件中实际定义它lib.c.

注意:请注意声明和定义变量之间的区别.externkeyword允许在不定义的情况下提前声明变量.如果您没有定义变量lib.c,则在尝试使用此变量时会出现错误.因为,它只是声明,但实际上没有定义.

编辑:完整的目的static是声明一个变量对于声明的源文件是私有的.因为,extern通过链接另一个源文件中定义的变量来反过来,它就失败了static.extern说变量有外部连接static说变量有内部连接.标识符不能同时具有内部和外部链接.

根据MSND:

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

有关更多信息,请查看以下