[英]How do I get the type of an object in code?
如何找出C語言中對象的類型? 我的目標是在C中創建一個鏈接列表容器。
假設我有一個使用void指針的函數:
...
Foo *f;
f = Allocate(f);
...
void *Allocate(void *item)
{
return malloc(sizeof(f.GetType));
}
如何使以上語法成為可能?
那不可能 void *
指針只是指向內存的指針,僅此而已,沒有更多的信息附加到該指針。 無法執行您要問的事情,您不知道要malloc
多少個字節。
這就是為什么stdlib.h
庫中的qsort
函數將每個數組元素的字節size
作為參數的原因。 如果您建議的內容可行,則qsort
不需要這樣的參數。
也許您可以執行以下操作:
...
Foo *f;
f = Allocate(f, sizeof(Foo));
...
void *Allocate(void *item, size_t size)
{
return malloc(size);
}
在C語言中,由於類型信息未存儲在對象中,因此沒有跨平台的方法可以找到void *的基礎類型。 在C ++中,已為對象添加了此功能。
當然,您可以自己為自己的對象實現它,例如,將每個對象的大小存儲在對象本身中,但是對於系統對象,則沒有內置的方法。
只是無法使用該對象的void *
來獲取type
。 如果可以在調用Allocate()
之前計算Foo
的大小,然后獲取該大小並將其作為參數傳遞給Allocate()
,否則您應該使Foo
在Allocate()
內部可見以找到該大小。
用C語言執行此操作的唯一方法是創建自己的類型系統,在其中將typeinfo包含在所創建的類型中。 這就是在Objective-C中所做的事情。 在C語言中,所有類型都只是一系列字節,當您分配內存時,您只是在分配字節,對於C編譯器而言,使用這些字節的內容無關緊要。
C的(可爭論的)美在於它沒有這樣做。 空指針只是可以指向任何內容的地址。 您可以創建自己的對象系統(具有“類型”字段和“數據”字段的結構是一種簡單的方法)。 從您的實現中,也可以將allocate
函數粘貼到Foo
結構中(假設它是),該結構知道如何分配自身(類型在此處已知)。
void *Allocate(void *item)
{
return malloc(sizeof(f.GetType));
}
是不可能的。 ISO C語言不提供任何通過變量獲取類型信息的工具。 Gcc的擴展名包含一個名為“ typeof”的運算符,它可以從實型中獲取類型信息。 如:
typeof (x[0](1))
int a; typeof (a) b; b = a;
但是即使typeof也無法從void指針獲取實型信息。 以下代碼無法成功編譯:
void *Allocate(typeof(*item) *item)
{
return malloc(sizeof(*item));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.