我如何在C中将类型的变量更改为另一个?

时间:2010-05-12 21:13:03

标签: c casting types

我想这样做:

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中完成它?

编辑:

停止停止!请看,你在做什么是类型转换,我知道,你正在创建另一个所需类型的变量,如int i =(int)onetype,我不想要这个,我想要其他像onetype =(int )ontyype,不重新创建它们,不分配另一个变量。

非常感谢你们!

3 个答案:

答案 0 :(得分:7)

您想要的是运行时类型信息 - 要有一个变量,其中类型只能在运行时确定。 C在语言中没有此功能 - 一旦编译程序,类型将被删除,并且只存在内存blob。动态语言维护类型信息并在本地实现。

您可以设计自己的本土类型标记系统:

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类型时,必须为要存储的每种可能类型的变量实现一个条件,或者能够确定是否允许在该代码区域中使用某种类型。

答案 1 :(得分:1)

听起来您的情况如下

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


}

答案 2 :(得分:0)

int lolcakes = *(void*)onetype;

这假设您确定onetype指向int。使用这种类型的铸件非常不安全。