不能理解的类型定义

we_sky2008 2010-05-11 03:34:11

//在一个打印机的程序里看到这样的代码(程序在打印机的编译器里编译没有问题),觉得很奇怪,
//大家看下代码是否合法,大家是否见过这样的用法

//.h
typedef struct
{
unsigned char bit0 : 1;
unsigned char bit1 : 1;
unsigned char bit2 : 1;
unsigned char bit3 : 1;
unsigned char bit4 : 1;
unsigned char bit5 : 1;
unsigned char bit6 : 1;
unsigned char bit7 : 1;
} Register;

typedef union
{
char byte;
Register bits;
} xdata Mix_Reg;//此处xdata和Mix_Reg怎么理解?在VC6中会报错

typedef union
{
char byte;
Register bits;
} SFR_Reg;

//.c
unsigned int xdata PrtAreaDot;//变量的类型是什么?
unsigned int xdata PrtAreaRight;
unsigned int xdata PrtAreaLeft;
...全文
124 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
serina_dsc 2010-05-11
  • 打赏
  • 举报
回复
看不懂
ThirtyFantasy 2010-05-11
  • 打赏
  • 举报
回复

typedef struct
{
unsigned char bit0 : 1;
unsigned char bit1 : 1;
unsigned char bit2 : 1;
unsigned char bit3 : 1;
unsigned char bit4 : 1;
unsigned char bit5 : 1;
unsigned char bit6 : 1;
unsigned char bit7 : 1;
} Register;

typedef union
{
char byte;
Register bits;
} xdata Mix_Reg; //标准不允许这样声明吧。
typedef union
{
char byte;
Register bits;
} SFR_Reg; //这里定义了一个新的数据类型SFR_Reg。

//.c
SFR_Reg PrtAreaDot; //这里声明了一个SFR_Reg型的变量。


hai040 2010-05-11
  • 打赏
  • 举报
回复
http://wenku.baidu.com/view/d1c5b7e9856a561252d36fe7.html
we_sky2008 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 abfahren2000 的回复:]
前面的我说错了...
没看清楚...
Sorry
[/Quote]
刚开始我也以为

typedef union
{
char byte;
Register bits;
} xdata Mix_Reg;

xdata是类型名,Mix_Reg是定义的xdata类型的变量
但实际上编译器报错
abfahren2000 2010-05-11
  • 打赏
  • 举报
回复
前面的我说错了...
没看清楚...
Sorry
we_sky2008 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bill_cpen 的回复:]
多看看课本啊。。容易理解啊。
[/Quote]
用typedef取的别名是一种彻底的封装,不能再用其他的类型说明符进行扩展
所以:unsigned int xdata PrtAreaDot;应该是错误的
taodm 2010-05-11
  • 打赏
  • 举报
回复
去找本C51的书吧,就别太懒了。
we_sky2008 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 pengzhixi 的回复:]
引用 7 楼 we_sky2008 的回复:
引用 5 楼 pengzhixi 的回复:
这个恐怕要问那些搞单片机的人士了。

我在VC6里面试了下
两处注释的地方都会报错


他们肯定会有自己的编译器的。
[/Quote]
恩,是有的
但是就像:
unsigned int xdata PrtAreaDot;
根本看不明白嘛,PrtAreaDot究竟是什么类型的变量呢?
pengzhixi 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 we_sky2008 的回复:]
引用 5 楼 pengzhixi 的回复:
这个恐怕要问那些搞单片机的人士了。

我在VC6里面试了下
两处注释的地方都会报错
[/Quote]

他们肯定会有自己的编译器的。
bill_cpen 2010-05-11
  • 打赏
  • 举报
回复
多看看课本啊。。容易理解啊。
we_sky2008 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 taodm 的回复:]
别把单片机的C51语言扯在VC6里试。
[/Quote]
那您觉得这段代码符合C的标准语法吗?
we_sky2008 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pengzhixi 的回复:]
这个恐怕要问那些搞单片机的人士了。
[/Quote]
我在VC6里面试了下
两处注释的地方都会报错
taodm 2010-05-11
  • 打赏
  • 举报
回复
别把单片机的C51语言扯在VC6里试。
pengzhixi 2010-05-11
  • 打赏
  • 举报
回复
这个恐怕要问那些搞单片机的人士了。
Beyond_cn 2010-05-11
  • 打赏
  • 举报
回复
书上好像讲过这种没有结构名称的声明方法,不会用到结构的名称,它的成员会位于所在结构体中相应的位置。。具体的我也记不太清楚了。。
abfahren2000 2010-05-11
  • 打赏
  • 举报
回复
第一处是xdata类型的全局变量 Mix_Reg
后面类型是xdata
we_sky2008 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 laowu_ 的回复:]
位域.
[/Quote]
恩,谢谢!
我迷惑的是有注释的地方
_JeffreyWu 2010-05-11
  • 打赏
  • 举报
回复
位域.

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧