2012-01-09 7 views
0

Cでオブジェクトの種類を調べるにはどうすればよいですか?私は、上記の構文を可能にするにはどうすればよいコード内のオブジェクトの型を取得するにはどうすればよいですか?

... 
Foo *f; 
f = Allocate(f); 
... 

void *Allocate(void *item) 
{ 
    return malloc(sizeof(f.GetType)); 
} 

:これで私の目標は、のは、私がvoidポインタをとる関数を持っていると仮定しましょう

C.

でリンクリストのコンテナを作成するのですか?

+0

1)リンクリストを作成するためにタイプを知る必要があるのはなぜですか? 2)明示的にC++を使いたくないのですか? – dbrank0

答えて

2

これはできません。 A void *ポインタはメモリへの単なるポインタであり、それ以上の情報はそれに付随していません。あなたが求めていることをすることは不可能です。mallocまでのバイト数を知ることはできません。

stdlib.hライブラリからqsort関数がパラメータ 各配列要素のバイト単位のsizeとして取る理由、です。あなたが提案したことが可能だった場合は、 qsortにこのようなパラメータは必要ありません。

おそらく、あなたはこのような何かを行うことができます。type情報がオブジェクトに格納されていないので、

... 
Foo *f; 
f = Allocate(f, sizeof(Foo)); 
... 

void *Allocate(void *item, size_t size) 
{ 
    return malloc(size); 
} 
2

はCで、ボイド*の基になる型を見つけるために何のクロスプラットフォームの方法はありません。 C++では、オブジェクトに対してこの機能が追加されています。

もちろん、オブジェクト自体にすべてのオブジェクトのサイズを格納するなど、自分のオブジェクト用に自分自身で実装することもできますが、システムオブジェクトに対しては組み込みの方法はありません。

+0

ところで、私はMicrosoft Compiler v9.0(Visual Studio 2008)で作業していますが、クロスプラットフォームコードは私のプロジェクトの優先事項ではありません。 –

+0

上記の構文が必要なすべての型をタグ付けして追跡する作業を考えると、私はそれを行う別の方法を探しています。あなたの例でCでそれを行う通常の方法は、呼び出し時に型を知っているので、代わりにsizeof(Foo)を割り当てに渡すことです。 –

1

typeは、そのオブジェクトにvoid *を使用して取得することはできません。 Allocate()を呼び出す前にFooのサイズを計算できる場合は、サイズを取得してAllocate()にパラメータとして渡します。それ以外の場合は、Allocate()の内側にFooを表示してサイズを確認する必要があります。

1

Cでこれを行う唯一の方法は、作成するタイプにtypeinfoを含める独自のタイプシステムを作成することです。これは例えばObjective-Cで行われたことです。 Cでは、すべての型は単なる一連のバイトです。バイトを割り当てるメモリを割り当てると、そのバイトを使用するのはCコンパイラには関係ありません。

1

Cの(議論の余地のない)美しさは、これをしないということです。 voidポインタは、のいずれかを指すことができるアドレスです。。独自のオブジェクトシステムを作成することもできます(「タイプ」フィールドと「データ」フィールドを持つ構造は簡単な方法です)。あなたの実装からは、allocate関数をFoo構造体に張り付けることも可能です(それを仮定していると仮定します)。

1
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)); 
} 
関連する問題