- 论坛徽章:
- 0
|
本帖最后由 pan_0326 于 2010-06-05 12:36 编辑
详解EXTENDS
EXTENDS宏是Coo的核心,借用java的关键字extends,继承扩展的意思,
在Coo中当作"嵌入"更容易理解.它的原始朴素的形态是这样的:
#define EXTENDS(s) s s;
嵌入基类,并且用基类名作为成员名,这是为了记忆访问方便.
typedef struct CBase { int i; } CBase;
typedef struct T1 { EXTENDS(CBase) } T1;
T1 t; //t.CBase t.CBase.i
子类可以访问基类整体t.CBase,很满意;可t.CBase.i就不如C++的t.i
了,继承链越长越麻烦:
typedef struct T2 { EXTENDS(T1) } T2;
...
typedef struct TN { EXTENDS(TN_1) } TN;
TN t;
访问CBase要这么写:t.TN_1....T1.CBase
访问i要这么写:t.TN_1....T1.CBase.i
累死!怎么办?用匿名struct,它的特性就是可以直接访问内层:
#define EXTENDS(s) s;
访问i终于不用一长串了,直接t.i,很好!可无法访问CBase整体了,用强
制类型转换,是个坏主意.用匿名union结合上述两种方法得到最终的版本:
#define EXTENDS(s) \
union \
{ \
s s; \
s; \
};
这样任何深度的成员都有两种访问方式---跨层和逐层
t.TN_1....T1.CBase和t.TN_1....T1.CBase.i就是逐层,t.CBase和t.i就
是跨层,完美!
最后问题就是编译器支持情况,匿名union虽然不是C标准,但几乎所有的C编
译器都支持,因为它是C++标准.就像//注释先是C++标准,C在没出C99标准前
都纷纷支持一样.
匿名struct呢?C标准允许直接嵌入struct { ... };不许struct CBase;没
道理,gcc加上-fms-extensions选项就支持了.
还有成员重名问题,C标准没说,而许多编译器实现时都允许,这有什么坏处
呢?第一个可访问即可. |
|