2012-03-16 8 views
-4

私たちはすべて、C言語のsizeof演算子の作業に精通しています。私はどのような種類のデータ型を吸収してサイズを返すような同様の作業関数を作成しようとしています。C sizeOf演算子:myOwnSizeOf()関数を作成したい

「C」のような似たような機能を誰かに教えてもらえますか?あなたが機能でそれを行うことはできません

int myOwnSizeOf(/*what would be parameter type?*/) 
{ 
    //and what about the definition? 
} 

おかげ

+4

元の 'sizeof'の何が問題なのですか? – PeterK

+0

回答者はいますか? –

+1

理由のために*演算子*です。できません。 –

答えて

1

実行時に関数が評価されるため、関数はデータ型を消費することはありませんが、オブジェクトのみを消費することはありません。そのため、sizeofは組み込みの演算子です。

この限定されたケースでは、テンプレート関数を使用してC++で動作するかもしれません。しかし、Cでは、データ型のオブジェクトを消費する唯一の可能性は、voidポインタまたはマクロです。しかし、前者はどんなタイプの情報も失い、後者はすでにアスシプラーによって提案されており、彼が指摘したように、何も買わない(とにかく機能ではない)ので、前者は機能しません。

7

。そのため、sizeofは、言語に組み込まれた演算子であり、ライブラリ関数ではありません。魔法です。

あなたは

#define myOwnSizeOf(x) (sizeof(x)) 

を行うことができますが、私は本当にポイントが表示されていません。

+0

ありがとうございます。しかし、実行時に目的のC( "id")のようなデータ型を消費する方法はありません。 –

+0

voidポインタ: 'void *'(もちろんあなたには役に立ちません) –

+1

@Pankaj:いいえ、Cではありません。ブライアンは指摘しているように、変数のアドレスを 'void *' (つまり、引数として整数または浮動小数点数のリテラルを渡すことはできません)、必要な型情報を正確に投げ捨てました。 Cは少なくともネイティブではない、あらゆる種類の反射機能をサポートしていません。 –

0
関数はそれを行うことはできません

、しかしマクロは、あなたが/本当に問題ではないだろうことはできません少し技術的なUBに投げる気にしないことができる場合:あなたが交換した場合

#define mysizeof(T) (size_t)((char *)((T*)0+1)-(char *)0) 

0を指定すると、静的格納期間オブジェクトのアドレスが他のどのオブジェクトよりも大きければ、UBは消えてしまいます。

編集:これはタイプTです。変数のバージョンははるかに簡単です:

#define mysizeof(v) (size_t)((char *)(&v+1)-(char *)&v) 
+0

ねえ、ねえ、UBの必要はありません –

+0

私は提案した変更のUBのないバージョンがありますか? –

+0

'offsetof(struct {T a; char b}、b)' :)のようなもの –

関連する問題