2015-07-28 173 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