структуры проверки типа - PullRequest
       6

структуры проверки типа

2 голосов
/ 27 декабря 2010
gcc 4.4.1 c89

У меня есть 2 разные структуры, которые называются origin_t и session_t.

Я бы передал экземпляр одной из этих структур в мою функцию.Однако прежде чем я смогу выполнить операцию над ними, мне нужно привести ее к правильному типу.Моя проблема в том, что я не знаю, как проверить правильный тип.Есть ли какая-нибудь стандартная функция c, которая может проверять правильность экземпляра этой структуры.

Ответы [ 3 ]

4 голосов
/ 27 декабря 2010

C не имеет никаких встроенных информационных возможностей типа времени выполнения, поэтому вам придется создавать свои собственные - например, помещая в начале обоих origin_t и session_t некоторое целое число или указатель на некоторое структура данных, которая позволит вам различать их.

4 голосов
/ 27 декабря 2010

Есть ли способ изменить типы?Похоже, самый простой способ поместить маленький член, который указывает тип, если нет другого способа узнать.

3 голосов
/ 27 декабря 2010

Лучшим способом было бы объединить типы (если возможно!) В общий тип, такой как:

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.

...