OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4634|回复: 7

为什么这里必须加static?

[复制链接]

138

主题

362

帖子

0

精华

高级会员

Rank: 4

积分
996
金钱
996
注册时间
2012-9-17
在线时间
29 小时
发表于 2015-10-25 14:46:10 | 显示全部楼层 |阅读模式
5金钱
请教大家一个问题:我在一个.h文件里定义了一个共同体:
static union 
{
float Float;
u8 U8[4];
}Float_U8;

然后在其他.c文件里调用,为什么这里的static 必须加,如果不加就会报错,只要是包含了这个.h的c文件都会报重复定义的错误。

最佳答案

查看完整内容[请看2#楼]

就像在头文件定义char i;多次引用会报错一样 如果换成extern char i;就不会报错了,加static应该是同样道理
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-10-25 14:46:11 | 显示全部楼层
就像在头文件定义char i;多次引用会报错一样
如果换成extern char i;就不会报错了,加static应该是同样道理
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2015-10-25 21:04:37 | 显示全部楼层
C语言不扎实,好好看看C。
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2014-9-30
在线时间
43 小时
发表于 2015-11-11 00:59:30 | 显示全部楼层
你应该去了解一下static存储类型的作用域,作用域在单个编译单元。
回复

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-12-13
在线时间
2 小时
发表于 2015-12-19 14:20:26 | 显示全部楼层
加了static,变量的作用域为当前.C文件,相当于在每个.C文件中各定义了一个变量,互不影响。

如果想在.h文件中定义变量可以用条件编译
#ifdefine __main_c
#define GLOBA
#else
#define GLOBA extern
#endif
GLOBA int a;

这样在main.c的文件开头加一句宏定义
#define __main_c
这样a在main.c中为定义int a;
在别的文件中就为外部声明extern int a;
回复

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-12-13
在线时间
2 小时
发表于 2015-12-19 14:22:44 | 显示全部楼层
你要知道.h中的内容相当于直接替换到了你写include "xx.h"的地方
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-1-30
在线时间
6 小时
发表于 2016-3-9 10:58:45 | 显示全部楼层
本帖最后由 leo2002zhang 于 2016-3-9 11:01 编辑

个人理解:
如果是想将定义为类型的话可以为:tydef union
{
float Float;
u8 U8[4];
}Float_U8;

这样在各个.c文件中包含这个头文件就不会出错了。


写成
union
{
float Float;
u8 U8[4];
}Float_U8;
应该就是在各个.c文件中都定义一个Float_U8的全局变量,所以冲突了。
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2015-12-31
在线时间
13 小时
发表于 2016-3-9 16:21:55 | 显示全部楼层
static定义的变量仅仅在定义的C文件有效,外部的文件不可访问
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 09:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表