gpt4 book ai didi

C宏/函数返回多种类型

转载 作者:太空宇宙 更新时间:2023-11-04 07:07:13 26 4
gpt4 key购买 nike

我有一个名为 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

恕我直言,这是一个相当脆弱的设计,你最好在 tfm 中使用 reqsize,或者至少对其他 3 个 structs 包含一个通用的 struct,其中包含 tfmreqsize,因此

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宏/函数返回多种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31669899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com