C90 не поддерживает это напрямую
Я предполагаю, что вы хотите написать какой-нибудь общий список в c90.Вот некоторые фрагменты, которые я использую в общем списке моего c90:
typedef struct {
void *rigth;
void *left;
void *value;
int index;
}GENLIST_node;
#define GENLIST_getValuePtr(NODE, index, valptr) __GENLIST_getValuePtr ((NODE), (index), (void*)(valptr))
, используя его, вы можете получить доступ к содержимому при его вызове и всегда получить обратно тип Rigth.Вот несколько примеров:
int *NODEVALA = NULL;
double *NODEVALB = NULL;
char *NODEVALC = NULL;
GENLIST_getValuePtr(&AnyNode, -1, &NODEVALA);
GENLIST_getValuePtr(&AnyNode, -1, &NODEVALB);
GENLIST_getValuePtr(&AnyNode, -1, &NODEVALC);
явно отсутствуют некоторые части, но я хочу отметить, что NODEVALA, NODEVALB и NODEVALC имеют любой тип, который вы хотите, чтобы они имели, и список сохраняет их в формеуказателя void.
в вашем случае это можно сделать с помощью рекурсивных вызовов во время выполнения
switch(condition){
case condition_structA:
structA *X;
getValPtr(&X);
...
break;
structB *X;
getValPtr(&X);
...
case condition_structB:
break;
}
В C90 нет способа использовать компилятор для таких вещей автоматически.Для этого вам понадобится полиморфизм, и это будет C ++ или лучше.