2010-12-27 10 views
2
gcc 4.4.1 c89 

私はorigin_tとsession_tという2つの異なる構造を持っています。型検査構造

これらの構造のインスタンスを私の関数に渡したいと思います。しかし、これらの操作を実行する前に、正しい型にキャストする必要があります。私の問題は、正しいタイプをチェックする方法がわからないことです。この構造の正しいインスタンスを確認できる標準的な関数がありますか?何かアドバイスのため

多くのおかげで、

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

最良の方法は、次のような一般的なタイプの下で(!可能な場合)タイプを組み合わせることであろう

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)に介入することなくそれを行う1つの方法です。また、奇妙なキャストを行う必要はなく、C言語の弱い型のシステムを妥協する必要もありません。

4

種類を変更する方法はありますか?それ以外の方法がない場合は、型を示す小さなメンバーを配置するのが最も簡単な方法のようです。

4

Cにはランタイム型の情報機能が組み込まれていないため、独自のコードを作成する必要があります。たとえば、origin_tsession_tのどちらかの先頭にあなたはそれらを区別することができます。その後、

typedef enum { 
    t_origin, 
    t_session 
} type_t; 

struct base_t { 
    type_t type; 
    union { 
     origin_t origin; 
     session_t session; 
    }; 
} 

と::