我对整个问题感到困惑,包括头文件和变量声明。
我使用的文件是:main.c,lib.h和lib.c。
#include "lib.h"
void main(void)
{
// Code here
var++;
}
#include <avr/io.h>
#include "lib.h"
void light_led(void)
{
// Code here
}
volatile int var;
void light_led(void);
这是制作和包含您自己的定制库的正确方法吗?
答案 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关键字指定变量或函数具有内部链接(其名称在声明它的文件外部不可见)。
有关详细信息,请查看以下内容: