Myauto123 发表于 2013-3-1 22:04:02

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

在看uml oopc时   其CLASS类的宏定义是这样的#define CLASS(type)\
typedef struct type type; \
struct type而它是这样一个例子来说明该类的使用的的CLASS(Rose)
{
      float price;
      int month;
void (*say) (Rose*);
};而我的不解在于:如果这样定义宏的话,那么预处理后那是不是变成typedef struct Rose Rose;
struct Rose
{
   float price;
   int month;
void (*say)(Rose*);
};如果预处理后变成上面那样,为什么变量类型重定义可以在变量还未定义前使用呢??

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

Myauto123 发表于 2013-3-2 00:40:42

RTFM。。。

chencc8 发表于 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*);了。

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

Myauto123 发表于 2013-3-13 18:00:33

我也感觉是这样。。。不过还是谢谢啦。。。应该和编译器有关的。。

Myauto123 发表于 2013-3-13 18:03:35

chencc8 发表于 2013-3-4 14:44 static/image/common/back.gif
最后一段代码中,首先声明了类型Rose,他的原型是struct Rose,
具体在下面的第二行的语句中声明,
第6行由 ...

应该是:编译器在遇到typedef struct type type;时仅会将type作为struct type 的别名而已,编译器只在声明type的对象时,才会检查它的定义。。
页: [1]
查看完整版本: uml oopc中class类宏定义变量重申与变量定义顺序的疑惑