Я хочу сделать это:
int main () {
bla bla bla
void *onetype;
switch (USER_INPUT_TYPE) {
CASE CONVERT_TO_CHAR:
convert onetype VOID TO CHAR >>> HOW???
CASE CONVERT_TO_INT:
convert onetype VOID TO INT >>> HOW???
LOT OF CASES...
}
}
Да, я знаю преобразование типа, но преобразование типа является 'временным' изменением.
Так, есть ли какой-либо способ выполнить его в C?
РЕДАКТИРОВАНИЕ:
Остановите остановку остановки! Посмотрите, что Вы делаете, преобразование типа, я ЗНАЮ ЭТО, Вы создаете другую переменную желательного типа как интервал i = (интервал) onetype, я не хочу это, я хочу что-то еще как onetype = (интервал) onetype, без воссоздают их, без выделяют другую переменную.
Большое спасибо парни!
Вы хотите получить информацию о типе во время выполнения - чтобы иметь переменную с типом определяется только во время выполнения. C НЕ имеет этой функциональности в языке - после компиляции программы типы стираются, и существуют только капли памяти. Динамические языки поддерживают информацию о типах и реализуют ее изначально.
Вы можете разработать свою собственную систему тегов самодельных типов:
typedef union {
int i;
char c;
float f;
} evil;
typedef struct {
evil value;
int type;
} tagged_t;
enum {
TYPE_INT, TYPE_CHAR, TYPE_FLOAT
};
tagged_t bar;
bar.value.c = 'a';
bar.type = TYPE_CHAR;
Теперь каждый раз, когда вы хотите использовать свой тип tagged_t, вы должны реализовать условие для каждого возможного типа переменной, которую вы сохраняете, или иметь возможность определить, будет ли тип разрешен в этой области кода или нет.
int lolcakes = *(void*)onetype;
Предполагается, что вы точно знаете, что onetype указывает на int. Использование такого типа литья невероятно небезопасно.
Похоже, ваш сценарий выглядит следующим образом
void * onetype
содержит указатель на строго типизированную переменную USER_INPUT_TYPE
сообщает вам тип этой переменной В этом случае попробуйте следующее
switch (USER_INPUT_TYPE) {
case CONVERT_TO_CHAR:
char c = *((char*)onetype);
...
break;
case CONVERT_TO_INT:
int i = *((int*)onetype);
...
break;
}