2011-08-30 111 views
1

我想知道是否可以獲取我想要動態生成的類型。例如。在c中輸入類型

void *ptr; 
typedef struct { 
.. 
common_field; 
.. 
} some; 

typedef struct { 
    .. 
    common_field; 
    .. 
    } some_other; 

現在我想知道我是否可以強制轉換ptr鍵入一些或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 *)) 

可以做些什麼沿着這些線。

謝謝。

回答

2

這幾乎是不可能的。表達式的類型在編譯時確定;它不能依賴任何執行時間條件。

可以,因爲你知道指向一個類型或其他對象的void*,做同樣的事情(我沒有測試過這一點):

condition ? ((some*)ptr)->common_field : ((some_other*)ptr)->common_field 

注意表達的->common_field部分必須重複;編譯器必須知道->運算符的左操作數的類型。

(根據上下文,一個if/else語句可能會更清晰)

+0

這在運行時是不可能的,但是使用宏它應該是可能的(儘管我不確定你爲什麼要這樣做)。 –

1

來設計你的數據結構來避免這樣的問題可能是:

typedef struct { 
    int common_field; 
    union { 
     struct { 
      int member1; 
     } some; 
     struct { 
      char* member2; 
     } some_other; 
    }; 
} common_struct; 
common_struct* ptr; 

然後你就可以輕鬆地訪問無論您擁有兩種變體中的哪一種,都可以使用ptr->common_field。我會想象這個共同領域的價值將告訴你需要使用哪兩個聯盟成員來訪問其餘成員,然後您將以ptr->some.member1ptr->some_other.member2的身份訪問該成員。

0

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

有obviousely一些地區失蹤,但我想指出什麼是NODEVALA,NODEVALB和NODEVALC有你希望他們有任何類型和列表保存他們的一種形式void指針。你的情況

這可能是與遞歸調用運行

switch(condition){ 
    case condition_structA: 
    structA *X; 
    getValPtr(&X); 
    ... 
    break; 
    structB *X; 
    getValPtr(&X); 
    ... 
    case condition_structB: 
    break; 

} 

期間完成在C90沒有辦法編譯器可用於自動完成這樣的事情。要做到這一點,你需要多態性,這將是C++或更好。