[英]typecasting in c
我想知道是否有可能將我想動態轉換的類型。 例如。
void *ptr;
typedef struct {
..
common_field;
..
} some;
typedef struct {
..
common_field;
..
} some_other;
現在,我想知道是否可以通過類型轉換ptr
來動態鍵入some或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 *))
可以按照這些思路做些什么。
謝謝。
那幾乎是不可能的。 表達式的類型在編譯時確定。 它不能取決於任何執行時間條件。
給定一個已知的void*
,您可以指向一種類型的對象或另一種類型的對象,您可以執行類似的操作(我尚未對此進行測試):
condition ? ((some*)ptr)->common_field : ((some_other*)ptr)->common_field
注意,表達式的->common_field
部分必須重復; 編譯器必須知道->
運算符的左操作數的類型。
(取決於上下文,if / else語句可能更清晰。)
設計數據結構以避免問題的一種方法可能是:
typedef struct {
int common_field;
union {
struct {
int member1;
} some;
struct {
char* member2;
} some_other;
};
} common_struct;
common_struct* ptr;
然后,您可以使用ptr->common_field
輕松訪問common成員,而不管您擁有兩個變體中的哪一個。 我想像一下,該公共字段的值將告訴您需要使用工會的兩個成員中的哪個來訪問其余成員,然后您將以ptr->some.member1
或ptr->some_other.member2
。
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);
顯然有一些部分缺失,但是我要指出的是NODEVALA,NODEVALB和NODEVALC具有您想要的任何類型,並且列表以空指針的形式保存它們。
在您的情況下,可以在運行時通過遞歸調用來完成
switch(condition){
case condition_structA:
structA *X;
getValPtr(&X);
...
break;
structB *X;
getValPtr(&X);
...
case condition_structB:
break;
}
在C90中,無法使用編譯器自動執行類似的操作。 要做到這一點,您將需要多態性,那將是C ++或更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.