我要在keil中头文件声明和C文件定义头文件中的变量,可是我在头文件中声明后再到C文件中定义的时候

接上,就会出问题,DEFINE1.C(2): error C279: 'i': multiple initialization,
如果不定义又会说我没定义,不声明又会说的没声明,我都不知道怎么办了,请大师帮帮忙,我写了#ifndef#define#endif语句的在头文件里

是这样的,通常,变量的定义是放在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;追问

是不是在头文件里写extern某某函数,但是不赋初值,然后在另一个c文件中定义这个函数,那这个c文件需要包涵这个头文件吗,还有我是把所有的声明定义都分别写在头文件和c文件里,那别的c文件要是要用到这些定义是要包涵头文件还是包涵用于定义的c文件呢

追答

记住了,变量,是先有定义,再有引用,如果只引用,不定义,这个变量无法使用.
用生活理解,引用,就是借用,比如邻居家借你家的东西用,定义,就是制造,邻居要借用,前提是你家要有才行。
举例来说,你家有个锅,非常好用,众邻居都喜欢,你又非常好,所以把锅放在一个公共环境下,这样,众邻居都可以拿来用。

那个锅,就是一个变量,所有权归你家,你家,就相当于定义了变量的C文件;
你把锅放在公共环境下,那个公共环境,就相当于被众多C文件包含的头文件;
而众邻居,就相当于要使用那个变量,并且包含了那个头文件的其他C文件。

追问

我知道声明定义区别,知道他们之间的关系,你就帮我解决下我问的问题就行了,麻烦你了
我的问题就是题目

追答

DEFINE1.C(2): error C279: 'i': multiple initialization
你的问题是这个吗?
看看提示不就清楚了?
"i" 多方面初始化。
就说,你定义的时候,给i初始化了,用extern 引用的时候,又初始化了。
引用的时候,不可以带初始化,例如,X.c文件里这样定义的变量:
unsigned char a = 100; 定义的时候可以初始化,在头文件或者其它C文件引用的时候,不能初始化,妈extern unsigned char a = 100;这是不可以的,直接引用就行了:extern unsigned char a;

追问

我用extern的时候没有给他赋值啊,extern都是在头文件里的,如果我不在c文件里赋值就不会有这样的错误,但是这样就会出现没有赋值的错误
我都快疯掉了

追答

你保证你的所有的extern 都在头文件?没有在别的C文件里引用?检查一下,要是还解决不了,去看我的百度个人资料,里面有我的联系方式。

追问

没有,我全是在头文件声明,然后在c文件里定义,并且在头文件中都加了extern
我回去检查下实在不信就再找你
要不我回去把文件发给你,你帮我看看?你的邮箱
我已经自己解决了,原因是我有个c文件包涵了别的c文件出现重复定义
不过还是非常感谢你写了这么多

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-10-01
#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
第2个回答  2013-04-27
声明有没有加 extern呢追问

加了哦

相似回答