gcc 4.4.1 c89
我有两种叫做origin_t和session_t的结构。
我想将这些结构之一的实例传递给我的函数。但是,在我可以对这些操作执行操作之前,我需要将其转换为正确的类型。我的问题是我不知道如何检查正确的类型。是否有任何标准c函数可以检查此结构的正确实例。
非常感谢任何建议,
const char* get_value(void *obj)
{
/* Cast to the correct structure type */
if(obj == origin) {
/* Is a origin structure */
origin_t *origin = (origin_t*)obj;
}
else if(obj == session) {
/* Is a session structure */
session_t *session = (session_t*)obj;
}
}
答案 0 :(得分:4)
有没有办法修改类型?如果没有其他方法可以告诉你,如果它是一个最简单的方法来放置一个指示类型的小成员。
答案 1 :(得分:4)
C没有任何内置的运行时类型信息功能,因此您必须创建自己的 - 例如,通过在origin_t
和session_t
的开头放置一些整数或指向某些数据结构的指针,可以让您区分它们。
答案 2 :(得分:3)
最好的方法是将类型(如果可能!)组合在一个常见类型下,例如:
typedef enum {
t_origin,
t_session
} type_t;
struct base_t {
type_t type;
union {
origin_t origin;
session_t session;
};
}
然后:
const char* get_value(base_t *obj)
{
/* Cast to the correct structure type */
if(obj->type == t_origin) {
/* Is a origin structure */
origin_t *origin = &obj->origin;
}
else if(obj->type == t_session) {
/* Is a session structure */
session_t *session = &obj->session;
}
}
没有办法从C中的指针确定类型。您必须添加自己的类型机制。这是一种方法,而不会在子类型(origin_t和session_t)中进行干扰。你也不必做奇怪的演员表,并且用C语言来破坏已经很弱的类型系统。