2011-08-30 88 views
1

我想知道是否可以获取我想要动态生成的类型。例如。在c中输入类型

void *ptr; 
typedef struct { 
.. 
common_field; 
.. 
} some; 

typedef struct { 
    .. 
    common_field; 
    .. 
    } some_other; 

现在我想知道我是否可以强制转换ptr键入一些或some_other动态。

正是我想知道的是,如果有可能有一个宏,TYPE_CAST(comdition)这让我的类型类似如下图所示:

(TYPE_CAST(condition)) ptr->common_field 

应相当于

((some *) ptr)->common_field or ((some_other *) ptr)->common_field 

基于condition

下面的不起作用,只是给这个,以便它可以清楚地理解c比英语:

TYPE_CAST(condition) ((condition) ? (some *) : (some_other *)) 

可以做些什么沿着这些线。

谢谢。

回答

2

这几乎是不可能的。表达式的类型在编译时确定;它不能依赖任何执行时间条件。

可以,因为你知道指向一个类型或其他对象的void*,做同样的事情(我没有测试过这一点):

condition ? ((some*)ptr)->common_field : ((some_other*)ptr)->common_field 

注意表达的->common_field部分必须重复;编译器必须知道->运算符的左操作数的类型。

(根据上下文,一个if/else语句可能会更清晰)

+0

这在运行时是不可能的,但是使用宏它应该是可能的(尽管我不确定你为什么要这样做)。 –

1

来设计你的数据结构来避免这样的问题可能是:

typedef struct { 
    int common_field; 
    union { 
     struct { 
      int member1; 
     } some; 
     struct { 
      char* member2; 
     } some_other; 
    }; 
} common_struct; 
common_struct* ptr; 

然后你就可以轻松地访问无论您拥有两种变体中的哪一种,都可以使用ptr->common_field。我会想象这个共同领域的价值将告诉你需要使用哪两个联盟成员来访问其余成员,然后您将以ptr->some.member1ptr->some_other.member2的身份访问该成员。

0

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)) 

。下面是一些例子:

int *NODEVALA = NULL; 
double *NODEVALB = NULL; 
char *NODEVALC = NULL; 

GENLIST_getValuePtr(&AnyNode, -1, &NODEVALA); 
GENLIST_getValuePtr(&AnyNode, -1, &NODEVALB); 
GENLIST_getValuePtr(&AnyNode, -1, &NODEVALC); 

有obviousely一些地区失踪,但我想指出什么是NODEVALA,NODEVALB和NODEVALC有你希望他们有任何类型和列表保存他们的一种形式void指针。你的情况

这可能是与递归调用运行

switch(condition){ 
    case condition_structA: 
    structA *X; 
    getValPtr(&X); 
    ... 
    break; 
    structB *X; 
    getValPtr(&X); 
    ... 
    case condition_structB: 
    break; 

} 

期间完成在C90没有办法编译器可用于自动完成这样的事情。要做到这一点,你需要多态性,这将是C++或更好。