我有一个名为tfm的通用对象,它可以是3个更大的类型(tfm是其他3种结构类型的开始)。基于tfm中的字段,我可以确定tfm属于哪个更大的结构。
所有3种结构类型都有一个以相同方式命名的字段(reqsize),但它不在tfm中。
有没有一些宏魔术可以让我做这样的事情:

CAST_UPPER(tfm)->reqsize

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

最佳答案

不像任何有结果的表达式那样容易(例如。

(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

这是一个相当脆弱的设计,你最好在reqsize中有tfm,或者至少其他3个structs包含一个包含structtfm的公共reqsize,因此
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

关于c - C宏/函数返回多种类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31669899/

10-10 12:30