类型检查结构

时间:2010-12-27 08:19:36

标签: c typechecking

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

3 个答案:

答案 0 :(得分:4)

有没有办法修改类型?如果没有其他方法可以告诉你,如果它是一个最简单的方法来放置一个指示类型的小成员。

答案 1 :(得分:4)

C没有任何内置的运行时类型信息功能,因此您必须创建自己的 - 例如,通过在origin_tsession_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语言来破坏已经很弱的类型系统。