Трудно сказать из одной строки, но похоже, что вы можете использовать команду препроцессора C
как
#define saveDesiredType desiredType // save previous setting
#define desiredType char* // change to type
... <code>
#define desiredType saveDesiredType // restore previous setting
однако, я думаю, вы можете определить определенный typedef только один раз в модуле (объектный файл .o).
ЕДИНСТВЕННЫЙ способ, которым я знаю для создания работоспособных древовидных структур переменных типов в C, состоит в том, чтобы перейти к модели манипуляции со всеми указателями, или добавить тип в качестве дополнительного параметра к функциям дерева, и сделать ВСЕМ указатель для различных размеры типов.
Немного более объектно-ориентированный подход будет заключаться в инкапсуляции ваших данных в структуру tree_node
с данными типа.
typedef enum D_Type { ANINT , AFLOAT, ADOUBLE, ACHAR, ASTRING, OTHER} DATATYPE;
typedef struct t_node{
DATATYPE dtype;
union { // union is ONE of the following types, and Only one.
int i; // size of the union is the size of the largest type.
float f;
double d;
char c;
char* string;
} // this union is unnamed , but could have a name.
} Tree_Node;
typedef Tree_Node* TreeItem; //pass by reference
В вашем коде вы должны включить node-> dtype и работать только с переменной этого типа.
void tree_add (Tree T, TreeItem item)
{
int i;
float f;
double d;
char c;
char* s;
switch (item->dtype){
case ANINT:
i = item->i;
break;
case AFLOAT:
f = item->f;
break;
case ADFLOAT:
d = item->d;
break;
...
}//switch
...<code>
}//tree_add
double Pi = 3.141592653589793238;
TreeItem ti = ( TreeItem ) malloc (sizeof(Tree_Node) ); // struct Must be allocated
ti->dtype = ADOUBLE;
ti->d = Pi;
ti->s = Pi; /* OOPS! error. (might go through without being detected -- depending on compiler) */
tree_add( atree , ti);
ti->s = "Now is the time for all good programmers to come the aid of their computers.";
/* OOPS! error. undefined behavior what about the double d?
(this might go through without being detected -- depending on compiler )
but ti->dtype was not changed either so code will break. */
(похоже на работу, не так ли?)