[英]typecasting in c
我想知道是否有可能将我想动态转换的类型。 例如。
void *ptr;
typedef struct {
..
common_field;
..
} some;
typedef struct {
..
common_field;
..
} some_other;
现在,我想知道是否可以通过类型转换ptr
来动态键入some或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 *))
可以按照这些思路做些什么。
谢谢。
那几乎是不可能的。 表达式的类型在编译时确定。 它不能取决于任何执行时间条件。
给定一个已知的void*
,您可以指向一种类型的对象或另一种类型的对象,您可以执行类似的操作(我尚未对此进行测试):
condition ? ((some*)ptr)->common_field : ((some_other*)ptr)->common_field
注意,表达式的->common_field
部分必须重复; 编译器必须知道->
运算符的左操作数的类型。
(取决于上下文,if / else语句可能更清晰。)
设计数据结构以避免问题的一种方法可能是:
typedef struct {
int common_field;
union {
struct {
int member1;
} some;
struct {
char* member2;
} some_other;
};
} common_struct;
common_struct* ptr;
然后,您可以使用ptr->common_field
轻松访问common成员,而不管您拥有两个变体中的哪一个。 我想像一下,该公共字段的值将告诉您需要使用工会的两个成员中的哪个来访问其余成员,然后您将以ptr->some.member1
或ptr->some_other.member2
。
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);
显然有一些部分缺失,但是我要指出的是NODEVALA,NODEVALB和NODEVALC具有您想要的任何类型,并且列表以空指针的形式保存它们。
在您的情况下,可以在运行时通过递归调用来完成
switch(condition){
case condition_structA:
structA *X;
getValPtr(&X);
...
break;
structB *X;
getValPtr(&X);
...
case condition_structB:
break;
}
在C90中,无法使用编译器自动执行类似的操作。 要做到这一点,您将需要多态性,那将是C ++或更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.