嵌入式—C语言—全局变量和extern的用法
1我新建了一个new.uvproj2其中包括main.ca.ca.hb.cb.h还有define.h(其中包括数据的申明和I/O口的定义)3我在define.h中定义了一...
1 我新建了一个new.uvproj
2 其中包括main.c a.c a.h b.c b.h 还有define.h(其中包括数据的申明和I/O口的定义)
3 我在define.h中定义了一个全局变量extern unsigned int Temperature_Temp;
4 这个变量在a.c中用到,所以在a.c中如下定义unsigned int Temperature_Temp;
5 在main.c中也要用到这个全局变量,那我还要在这个.c文件中再定义一次?我试过,这样keil报错,重复定义~~~
我的问题是:那我在a.c中使用extern定义,即extern unsigned int Temperature_Temp;
那按照我的理解:因为已经定义为全局变量了,那在main.c中就不需要定义了,这样理解对不对???
实验结果:这样keil虽不报错,可是出现很多警告!!!为什么???
后来,我在a.c中将其定义为extern unsigned int Temperature_Temp;
在main.c中将其定义为unsigned int Temperature_Temp;
就可以了(没有警告,也没有错误),可是,我百思不得其解,求大神指教~~~ 展开
2 其中包括main.c a.c a.h b.c b.h 还有define.h(其中包括数据的申明和I/O口的定义)
3 我在define.h中定义了一个全局变量extern unsigned int Temperature_Temp;
4 这个变量在a.c中用到,所以在a.c中如下定义unsigned int Temperature_Temp;
5 在main.c中也要用到这个全局变量,那我还要在这个.c文件中再定义一次?我试过,这样keil报错,重复定义~~~
我的问题是:那我在a.c中使用extern定义,即extern unsigned int Temperature_Temp;
那按照我的理解:因为已经定义为全局变量了,那在main.c中就不需要定义了,这样理解对不对???
实验结果:这样keil虽不报错,可是出现很多警告!!!为什么???
后来,我在a.c中将其定义为extern unsigned int Temperature_Temp;
在main.c中将其定义为unsigned int Temperature_Temp;
就可以了(没有警告,也没有错误),可是,我百思不得其解,求大神指教~~~ 展开
展开全部
全局变量区分静态全局变量和全局变量两种。
1 静态全局变量。
有static修饰的变量为静态全局变量。需要定义在函数外,可以在定义位置到本文件结束部分使用。定义格式为
static type var=init_value;
作用为定义一个类型为type,变量名为var的静态全局变量,并赋初始化值为init_value。当=init_value部分被省略时,系统自动初始化为0值。
可以用extern扩展可使用空间,声明格式为
extern type var;
注意不可以有初始化值。
extern声明只允许出现在本文件内,声明后,可以在声明语句到文件尾使用该变量。
2 全局变量。
没有static修饰的变量为全局变量。需要定义在函数外,可以在定义位置到本文件结束部分直接使用。定义格式为
type var=init_value;
作用为定义一个类型为type,变量名为var的全局变量,并赋初始化值为init_value。当=init_value部分被省略时,系统自动初始化为0值。
要在文件其它位置或其它文件中使用时,需要用extern进行声明,声明格式为
extern type var;
注意不可以有初始化值。
声明后,可以在声明语句到声明语句所在文件尾使用该变量。也可以写在头文件中,这样在引用该头文件的C文件中,可以在引用位置到文件结尾使用该变量。
1 静态全局变量。
有static修饰的变量为静态全局变量。需要定义在函数外,可以在定义位置到本文件结束部分使用。定义格式为
static type var=init_value;
作用为定义一个类型为type,变量名为var的静态全局变量,并赋初始化值为init_value。当=init_value部分被省略时,系统自动初始化为0值。
可以用extern扩展可使用空间,声明格式为
extern type var;
注意不可以有初始化值。
extern声明只允许出现在本文件内,声明后,可以在声明语句到文件尾使用该变量。
2 全局变量。
没有static修饰的变量为全局变量。需要定义在函数外,可以在定义位置到本文件结束部分直接使用。定义格式为
type var=init_value;
作用为定义一个类型为type,变量名为var的全局变量,并赋初始化值为init_value。当=init_value部分被省略时,系统自动初始化为0值。
要在文件其它位置或其它文件中使用时,需要用extern进行声明,声明格式为
extern type var;
注意不可以有初始化值。
声明后,可以在声明语句到声明语句所在文件尾使用该变量。也可以写在头文件中,这样在引用该头文件的C文件中,可以在引用位置到文件结尾使用该变量。
大雅新科技有限公司
2024-11-19 广告
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,...
点击进入详情页
本回答由大雅新科技有限公司提供
展开全部
全局变量在同一个工程中只能是唯一的,即不能在两个.c里面定义同名全局变量。
extern只是告诉编译器这个.c在其他的文件里面声明了,我这个.c不用声明这个变量。最后链接的时候编译器会找这个变量的实现,如果没有实现,链接报错。
1、在a.c里使用extern定义,只是声明一下这个变量在其他文件定义,不是真正的定义,所以这样是错误的。
extern只是告诉编译器这个.c在其他的文件里面声明了,我这个.c不用声明这个变量。最后链接的时候编译器会找这个变量的实现,如果没有实现,链接报错。
1、在a.c里使用extern定义,只是声明一下这个变量在其他文件定义,不是真正的定义,所以这样是错误的。
追问
请教大神:
可是我在define.h中已经使用extern声明了,后面在main.c和a.c中干嘛还需要使用extern?求大神指教~~~
追答
你的main.c里面要include这个.h才可以的不用extern。另外.c和.h里面同时extern是不会报错的呀。
extern只是一个声明,并不是真正的实现,所以extern很多次都没有关系,但是实现只能有一次。
1、三个.c里面都有extern,没有一个里面有实现。编译通过,链接报错变量找不到。
2、三个.c里面都有实现。编译通过,链接报错变量重复定义。
3、一个实现,其他使用extern,编译链接都能通过。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
extern是声明外部变量,正如它的英文名字一样,你可以在其他文件当中使用它
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询