2015-07-28 172 views
0

我有一个名为tfm的通用对象,可以是3个更大的类型(tfm是其他3种类型结构的开始)。根据tfm中的字段,我可以确定tfm属于哪个更大的结构。
所有3种结构类型都有一个以相同方式命名的字段(reqsize),但不在tfm内。
有一些宏观魔力,可以让我做这样的事情:C宏/函数返回多种类型

CAST_UPPER(tfm)->reqsize 


它可以是特定的gcc编译器扩展。

+0

用枚举类型,内联函数和疯狂优化编译器s,预处理器最好归入头文件和条件编译。它的“弱点”有充分的文件记录,应尽可能避免。 – paxdiablo

回答

3

不容易作为有结果的任何表达式(例如

(tfm)->type == TYPE1 ? (type1*)(tfm) : (tfm)->type == TYPE2 ? (type2*)(tfm) : (type3*)(tfm) 

)将编译失败因为各种结果表达式有不同的类型。你必须有一些像

#define CAST_UPPER(tfm, field) \ 
    (tfm)->type == TYPE1 ? (type1*)(tfm)->field : \ 
    (tfm)->type == TYPE2 ? (type2*)(tfm)->field : 
          (type3*)(tfm)->field 

恕我直言,这是相当脆弱的设计,并且你会做的更好有reqsizetfm,或者至少其他3 structs有含有包含在公共structtfmreqsize,从而

typedef struct TFM { ... } TFM; 
typedef struct TFMREQ { 
    TFM tfm; 
    size_t reqsize; 
} TFMREQ; 
struct TYPE1 { TFMREQ tfmreq; ... }; 
struct TYPE2 { TFMREQ tfmreq; ... }; 
struct TYPE3 { TFMREQ tfmreq; ... }; 

然后,你可以只是做(TFMREQ *)tfm->reqsize