变量定义用结构体有什么好处?

[复制链接]
 楼主| hotpover 发表于 2007-7-19 17:40 | 显示全部楼层 |阅读模式
gtw 发表于 2007-7-19 19:05 | 显示全部楼层

空间上连续

编译时便于用指针优化

阅读程序时也方便

可以问问洪七
 楼主| hotpover 发表于 2007-7-19 19:45 | 显示全部楼层

哦,3q

 楼主| hotpover 发表于 2007-7-19 20:50 | 显示全部楼层

那用union呢?

yuyixuanta 发表于 2007-7-19 21:53 | 显示全部楼层

你用一下会有体会的

zjf0000 发表于 2007-7-20 08:06 | 显示全部楼层

单片机程序建议不要用union

ayb_ice 发表于 2007-7-20 08:16 | 显示全部楼层

单片机程序建议不要用union?

谁建议的...
HWM 发表于 2007-7-20 08:39 | 显示全部楼层

LZ:“结构体”顾名思义

就是有利于帮助你以“结构化”的思路构建数据。
yewuyi 发表于 2007-7-20 09:33 | 显示全部楼层

6楼说的好奇怪!?

emailli 发表于 2007-7-20 09:42 | 显示全部楼层

6楼的话是有道理的

联合体和结构体一起使用的时候涉及大端小端的问题。

所以,如果不是很了解的话,尽量不要用。

当然了,如果已经很熟悉了,用了 也无妨。
yewuyi 发表于 2007-7-20 10:22 | 显示全部楼层

大端小端是个问题

但在MCU的C中,如果只是做BIT定义操作的话,不考虑它问题也不大

这和编译器有关系的了,所以尽量不要乱换编译器了……
leo305 发表于 2007-7-21 16:00 | 显示全部楼层

大端小端是什么概念啊?

    用union也有方便的地方,比如需将一个字节的内容的高8位和低8位分别取出时,用union就方便啦!
 楼主| hotpover 发表于 2007-7-21 17:19 | 显示全部楼层

请LS举个例子

yewuyi 发表于 2007-7-21 17:27 | 显示全部楼层

大端小端就是正着排还是反着来的问题

完全是编译器自己确定的,但一般的编译器都是正着排的……
high 发表于 2007-7-21 17:46 | 显示全部楼层

联合体

当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;

当多种类型,多个对象,多个事物只取其一时(“n选1”),我们也可以使用联合体来发挥其长处。

----个人感觉:
不过终极武器是“指针+强制类型转换”,用指针说明你考虑和理解了字节序(大小端)和字节对齐问题。

可读性对于新人会感觉稍微差一丁点。
Rightnow10 发表于 2007-7-21 19:58 | 显示全部楼层

hotpover?

hotpover 楼主假冒hotpower!!
gyt 发表于 2007-7-21 20:21 | 显示全部楼层

LS

楼上刚知道啊。哈~~~~~
hotpower 发表于 2007-7-22 00:56 | 显示全部楼层

最大的好处是便于管理~~~

由于工控实时记录的数据较多,而且要求在复位后也不能丢失数据.
在短时内是可以靠系统残余的电能支撑使RAM数据得以保持.

所以它和我们编写PC软件有很大的区别---全局变量较多.
如果使用单独的变量,那么分类很不明确.

再者就是变量名的管理,由于C语言和C++不同,C++的变量都封装在各自的类中,
名称相同的变量由于类名的不同也就自动区分出来了.

而C只能搞结构体了,这和无成员函数的C++结构或类是等同的.

这就是很多人包括俺喜欢结构的原因吧.

再就是联合了,它可以帮助你的工作,少费些脑浆~~~

例如:
    union
    {
        volatile unsigned char SystemFlag;
        struct
        {
            unsigned char MainExecFlag: 1;
            unsigned char EInt0ExecFlag: 1;
            unsigned char EInt1ExecFlag: 1;
            unsigned char Timer0ExecFlag: 1;
            unsigned char Timer1ExecFlag: 1;
            unsigned char Timer2ExecFlag: 1;
            unsigned char UartTxExecFlag: 1;
            unsigned char UartRxExecFlag: 1;
        };
    };

MainExecFlag=1;
等效为:
SystemFlag |= (1 << _MainExecFlag);//#define _MainExecFlag 0

UartRxExecFlag=0;
等效为:
SystemFlag &= ~(1 << _UartRxExecFlag);//#define _UartRxExecFlag 7


联合肯定方便些
HOTPOVER 发表于 2007-7-22 01:09 | 显示全部楼层

好!~~~第一次见菜农的文笔如此之工整!!

hotpower 发表于 2007-7-22 01:39 | 显示全部楼层

我倒~~~

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

本版积分规则

431

主题

2397

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部