搜索
bottom↓
回复: 4

uml oopc中class类宏定义变量重申与变量定义顺序的疑惑

[复制链接]

出0入0汤圆

发表于 2013-3-1 22:04:02 | 显示全部楼层 |阅读模式
在看uml oopc时   其CLASS类的宏定义是这样的
  1. #define CLASS(type)\
  2. typedef struct type type; \
  3. struct type
复制代码
而它是这样一个例子来说明该类的使用的的
  1. CLASS(Rose)
  2. {
  3.       float price;
  4.       int month;
  5. void (*say) (Rose*);
  6. };
复制代码
而我的不解在于:如果这样定义宏的话,那么预处理后那是不是变成
  1. typedef struct Rose Rose;
  2. struct Rose
  3. {
  4.      float price;
  5.      int month;
  6. void (*say)(Rose*);
  7. };
复制代码
如果预处理后变成上面那样,为什么变量类型重定义可以在变量还未定义前使用呢??

不知道是那个C中的哪个概念认识不清。。。

出0入0汤圆

 楼主| 发表于 2013-3-2 00:40:42 | 显示全部楼层
RTFM。。。

出0入0汤圆

发表于 2013-3-4 14:44:59 | 显示全部楼层
最后一段代码中,首先声明了类型Rose,他的原型是struct Rose,
具体在下面的第二行的语句中声明,
第6行由于是在第一行声明过Rose类型后声明的,所以可以直接使用Rose类型。

就像你在一个源程序文件中,向后定义了两个函数:
void A(void)
{
...
}
void B(void)
{
....
}
假如需要在A函数中调用B函数,那么就需要在A函数之前先声明B函数:
void B(void);
这样,编译器就知道A函数中调用的B函数的格式对不对,到后期再将B函数连接到A函数中。

同理,typedef struct Rose Rose;定义Rose类型的时候,编译器只需要知道这个类型的原型是叫做struct Rose的结构体就行了,
具体的struct Rose在什么位置定义先不管。
这样,第六句就可以是void (*say) (Rose*);而不是void (*say) (struct Rose*);了。

以上是我的猜测~真正原理是怎么样的 看下编译原理之类的书应该能知道

出0入0汤圆

 楼主| 发表于 2013-3-13 18:00:33 | 显示全部楼层
我也感觉是这样。。。不过还是谢谢啦。。。应该和编译器有关的。。

出0入0汤圆

 楼主| 发表于 2013-3-13 18:03:35 | 显示全部楼层
chencc8 发表于 2013-3-4 14:44
最后一段代码中,首先声明了类型Rose,他的原型是struct Rose,
具体在下面的第二行的语句中声明,
第6行由 ...

应该是:编译器在遇到typedef struct type type;时仅会将type作为struct type 的别名而已,编译器只在声明type的对象时,才会检查它的定义。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 11:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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