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

ИМХО это довольно хрупкая конструкция, и вы бы лучше иметь 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

Смежные вопросы