簡體   English   中英

如何在代碼中獲取對象的類型?

[英]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() ,否則您應該使FooAllocate()內部可見以找到該大小。

用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM