我要在keil中头文件声明和C文件定义头文件中的变量,可是我在头文件中声明后再到C文件中定义的时候
接上,就会出问题,DEFINE1.C(2):errorC279:'i':multipleinitialization,如果不定义又会说我没定义,不声明又会说的没声明,我都...
接上,就会出问题,DEFINE1.C(2): error C279: 'i': multiple initialization,
如果不定义又会说我没定义,不声明又会说的没声明,我都不知道怎么办了,请大师帮帮忙,我写了#ifndef#define#endif语句的在头文件里 展开
如果不定义又会说我没定义,不声明又会说的没声明,我都不知道怎么办了,请大师帮帮忙,我写了#ifndef#define#endif语句的在头文件里 展开
3个回答
展开全部
是这样的,通常,变量的定义是放在C文件里,而不是头文件里,C文件定义,头文件引用。
比如,你在X.c定义一个变量 unsigned char a;如果你想要在Y.C文件里使用这个变量,你可以在Y.C里引用,引用方法如下:extern unsigned char a;
你也可以在一个头文件里引用,引用方法是一样的:extern unsigned char a;
在头文件引用后,凡是包含了这个头文件的C文件,都可以使用那个变量a,而不必再另外引用了。
有一点要注意,引用的时候,不可以带初始化,例如,X.c文件里这样定义的变量:
unsigned char a = 100; 定义的时候可以初始化,在头文件或者其它C文件引用的时候,不能初始化,妈extern unsigned char a = 100;这是不可以的,直接引用就行了:extern unsigned char a;
比如,你在X.c定义一个变量 unsigned char a;如果你想要在Y.C文件里使用这个变量,你可以在Y.C里引用,引用方法如下:extern unsigned char a;
你也可以在一个头文件里引用,引用方法是一样的:extern unsigned char a;
在头文件引用后,凡是包含了这个头文件的C文件,都可以使用那个变量a,而不必再另外引用了。
有一点要注意,引用的时候,不可以带初始化,例如,X.c文件里这样定义的变量:
unsigned char a = 100; 定义的时候可以初始化,在头文件或者其它C文件引用的时候,不能初始化,妈extern unsigned char a = 100;这是不可以的,直接引用就行了:extern unsigned char a;
更多追问追答
追问
是不是在头文件里写extern某某函数,但是不赋初值,然后在另一个c文件中定义这个函数,那这个c文件需要包涵这个头文件吗,还有我是把所有的声明定义都分别写在头文件和c文件里,那别的c文件要是要用到这些定义是要包涵头文件还是包涵用于定义的c文件呢
追答
记住了,变量,是先有定义,再有引用,如果只引用,不定义,这个变量无法使用.
用生活理解,引用,就是借用,比如邻居家借你家的东西用,定义,就是制造,邻居要借用,前提是你家要有才行。
举例来说,你家有个锅,非常好用,众邻居都喜欢,你又非常好,所以把锅放在一个公共环境下,这样,众邻居都可以拿来用。
那个锅,就是一个变量,所有权归你家,你家,就相当于定义了变量的C文件;
你把锅放在公共环境下,那个公共环境,就相当于被众多C文件包含的头文件;
而众邻居,就相当于要使用那个变量,并且包含了那个头文件的其他C文件。
展开全部
#ifdef MODULE_ANALOG
volatile signed int LatestCCI = 0; // most recent value of Instantaneous CC conversion
signed long CCoffset = 0x0000; // this is SUBTRACTED to EACH sample from the CC Accum.
signed int CCIoffset = 0; // this is in mA and is ONLY SUBTRACTED to the 1-second total, NOT TO EACH SAMPLE.
unsigned char FastRCCal = 0;
unsigned int SlowRCCal = 0;
unsigned char BGCCRCal = 0;
unsigned char ThermistorSelect = 0;
unsigned char CellToBalance = 0;
unsigned int cell_current[4]; //used for impedance measurement
signed long RunningAcc = 0;
#else
extern volatile signed int LatestCCI;
extern unsigned char FastRCCal;
extern unsigned int SlowRCCal;
extern unsigned char BGCCRCal;
extern unsigned char ThermistorSelect;
extern unsigned char CellToBalance;
extern unsigned int cell_current[4];
extern signed long RunningAcc;
#endif
volatile signed int LatestCCI = 0; // most recent value of Instantaneous CC conversion
signed long CCoffset = 0x0000; // this is SUBTRACTED to EACH sample from the CC Accum.
signed int CCIoffset = 0; // this is in mA and is ONLY SUBTRACTED to the 1-second total, NOT TO EACH SAMPLE.
unsigned char FastRCCal = 0;
unsigned int SlowRCCal = 0;
unsigned char BGCCRCal = 0;
unsigned char ThermistorSelect = 0;
unsigned char CellToBalance = 0;
unsigned int cell_current[4]; //used for impedance measurement
signed long RunningAcc = 0;
#else
extern volatile signed int LatestCCI;
extern unsigned char FastRCCal;
extern unsigned int SlowRCCal;
extern unsigned char BGCCRCal;
extern unsigned char ThermistorSelect;
extern unsigned char CellToBalance;
extern unsigned int cell_current[4];
extern signed long RunningAcc;
#endif
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
声明有没有加 extern呢
追问
加了哦
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询