Как я заменяю переменную типа к другому в C?

Я хочу сделать это:

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, без воссоздают их, без выделяют другую переменную.

Большое спасибо парни!

7
задан Bill the Lizard 13 May 2010 в 13:22
поделиться

3 ответа

Вы хотите получить информацию о типе во время выполнения - чтобы иметь переменную с типом определяется только во время выполнения. 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, вы должны реализовать условие для каждого возможного типа переменной, которую вы сохраняете, или иметь возможность определить, будет ли тип разрешен в этой области кода или нет.

7
ответ дан 7 December 2019 в 05:18
поделиться
int lolcakes = *(void*)onetype;

Предполагается, что вы точно знаете, что onetype указывает на int. Использование такого типа литья невероятно небезопасно.

0
ответ дан 7 December 2019 в 05:18
поделиться

Похоже, ваш сценарий выглядит следующим образом

  • 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;


}
1
ответ дан 7 December 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: