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中的哪个概念认识不清。。。 RTFM。。。
最后一段代码中,首先声明了类型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:} 我也感觉是这样。。。不过还是谢谢啦。。。应该和编译器有关的。。 chencc8 发表于 2013-3-4 14:44 static/image/common/back.gif
最后一段代码中,首先声明了类型Rose,他的原型是struct Rose,
具体在下面的第二行的语句中声明,
第6行由 ...
应该是:编译器在遇到typedef struct type type;时仅会将type作为struct type 的别名而已,编译器只在声明type的对象时,才会检查它的定义。。
页:
[1]