OpenEdv-开源电子网

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

结构体全局使用问题求助

[复制链接]

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-5-30
在线时间
30 小时
发表于 2014-8-27 14:21:39 | 显示全部楼层 |阅读模式
5金钱
union//共用体结构位域定义
{
u8 all;
struct
{
u8 a : 1;
u8 b : 1;
u8 c : 1;
u8 d : 1;
u8 e : 1;
u8 f : 1;
u8 g : 1;
u8 h : 1;
}bit;
}led_ram1;
//位操作led_ram1.bit.a;数据操作led_ram1.all

各位老大,上面这个结构体如何做到全局调用啊,怎么声明下,一直搞都出错,
单个C文件里面定义使用没有问题,我放到H文件里,其他C文件调用就出现重复定义




最佳答案

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

看你头文件怎么写的了。还有要在c文件中定义共用体变量。 比如: led_ram1 aa; 如:aa.all=0x5a; 则:aa.bit.a=0; aa.bit.b=1; aa.bit.c=0; aa.bit.d=1; aa.bit.e=1; aa.bit.f=0; aa.bit.g=1; aa.bit.h=0; 若在以其他c文件中调用aa.则要在头文件中声明 extern led_ram1 aa; 另外,头文件开头最好加 #ifndef __HEAD_H #define  __HEAD_H //中间加你头文件里的内容。 #endif __HEAD_H一般取你头 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12092
金钱
12092
注册时间
2013-3-8
在线时间
1285 小时
发表于 2014-8-27 14:21:40 | 显示全部楼层
看你头文件怎么写的了。还有要在c文件中定义共用体变量。
比如:
led_ram1 aa;
如:aa.all=0x5a;
则:aa.bit.a=0;
aa.bit.b=1;
aa.bit.c=0;
aa.bit.d=1;
aa.bit.e=1;
aa.bit.f=0;
aa.bit.g=1;
aa.bit.h=0;

若在以其他c文件中调用aa.则要在头文件中声明 extern led_ram1 aa;
另外,头文件开头最好加
#ifndef __HEAD_H
#define  __HEAD_H
//中间加你头文件里的内容。
#endif

__HEAD_H一般取你头文件名子的大写。如head.h 则用__HEAD_H 。main.h则用__MAIN_H。
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12092
金钱
12092
注册时间
2013-3-8
在线时间
1285 小时
发表于 2014-8-27 14:21:40 | 显示全部楼层
回复【5楼】gguoleil:
---------------------------------
T led_ram1; 不能在头文件中定义,要放在C文件中。
可以一位写。然后整个字节读。
回复

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2014-8-27 14:41:14 | 显示全部楼层
一种 是用  
typedef union{
...}T;
T led_ram1; 
在 使用的地方 或头文件 声明下 ,extern T led_ram1; 

另一种 类似,只是 在头文件 声明定义类型
union T{
...
}; // 此处不要定义数据

并 声明 extern union T led_ram1;

使用的地方 定义union T led_ram1;
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-5-30
在线时间
30 小时
 楼主| 发表于 2014-8-27 14:43:28 | 显示全部楼层
回复【2楼】aleda303:
---------------------------------
谢谢,那我这些文件是应该放在H文件里,还是C文件里?
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-5-30
在线时间
30 小时
 楼主| 发表于 2014-8-27 14:51:28 | 显示全部楼层
#ifndef __KEY1_H
#define __KEY1_H
//#include "sys.h"

typedef union//共用体结构位域定义
{
u8 all;
struct
{
u8 a: 1;
u8 b: 1;
u8 c: 1;
u8 d: 1;
u8 e: 1;
u8 f: 1;
u8 g: 1;
u8 h: 1;
}bit;
}T;
T led_ram1;
//位操作led_ram1.bit.a;数据操作led_ram1.all

extern T led_ram1;



#endif





这样定义头文件可以么
我要调用每位该怎么写
led_ram1.bit.a
led_ram1.all这样可以么
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-5-30
在线时间
30 小时
 楼主| 发表于 2014-8-27 14:55:22 | 显示全部楼层
两个文件调用这个头文件就出现 Error: L6200E: Symbol led_ram1 multiply defined (by key.o and main.o).
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-5-30
在线时间
30 小时
 楼主| 发表于 2014-8-27 15:14:58 | 显示全部楼层
非常感谢,问题解决了,将T led_ram1;放到主程序最上面就OK了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-2 05:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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