C宏/函数返回多种类型

时间:2015-07-28 07:25:05

标签: c macros

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

CAST_UPPER(tfm)->reqsize


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

1 个答案:

答案 0 :(得分:3)

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

capabilities = DesiredCapabilities.phantomjs();
driver = new RemoteWebDriver(capabilities);


driver.executePhantomJS( "var page = this; binary =0;mimetype=''; count = 0;id=0; bla = '{';"
                                +"page.onResourceReceived = function(request) {"
                                    + "if(id !== request.id){"
                                        +"bla += '\"'+count+ '\":'+JSON.stringify(request, undefined, 4)+',';"
                                        +"if(request.contentType.substring(0, 11) =='application'){"
                                            +"console.log(request.contentType);"
                                            + "mimetype = request.contentType;"
                                            + "binary++;"
                                        + "}"
                                        +"count++;"
                                        + "id = request.id;"
                                    + "}"                       
                                +"};");

)将无法编译,因为各种结果表达式具有不同的类型。你必须有像

这样的东西
(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,或至少让其他3 tfm拥有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