0
我有一個名爲tfm的通用對象,可以是3個更大的類型(tfm是其他3種類型結構的開始)。根據tfm中的字段,我可以確定tfm屬於哪個更大的結構。
所有3種結構類型都有一個以相同方式命名的字段(reqsize),但不在tfm內。
有一些宏觀魔力,可以讓我做這樣的事情:C宏/函數返回多種類型
CAST_UPPER(tfm)->reqsize
?
它可以是特定的gcc編譯器擴展。
我有一個名爲tfm的通用對象,可以是3個更大的類型(tfm是其他3種類型結構的開始)。根據tfm中的字段,我可以確定tfm屬於哪個更大的結構。
所有3種結構類型都有一個以相同方式命名的字段(reqsize),但不在tfm內。
有一些宏觀魔力,可以讓我做這樣的事情:C宏/函數返回多種類型
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
有含有包含在公共struct
tfm
和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
用枚舉類型,內聯函數和瘋狂優化編譯器s,預處理器最好歸入頭文件和條件編譯。它的「弱點」有充分的文件記錄,應儘可能避免。 – paxdiablo