2012-02-14 5 views
0

voidポインタのタイプをテストできますか?私はこの問題を解決したい:voidポインタが構造体または文字列の場合のテスト方法は?

void log(void *test) { 
    if (is a struct) { 
     NSLog(test); 
    } else { 
     printf("%s\n", test); 
    }  
} 

log(@"This send a struct (NSString)"); 
log("This send normal string"); 

それをテストする簡単な方法はありますか?

+3

これらのタグは、この疑問を完全にあいまいにします。 – Griwes

+2

なぜ3つの異なる言語でこれらのタグを付けましたか?これを達成するためには、各言語ごとに異なる方法があります。また、なぜそのようなLogメソッドを記述したいのですか?代わりに、それぞれ異なる入力タイプ(NSString)と(char *)を持つ2つの異なるlog()メソッドを宣言します。 – Alan

+0

objective-cはcのスーパーセットです。しかし、Objective-C++ではC++を使うことができます。おそらくC++は良い選択ではないでしょう。 – Rodrigo

答えて

6

いいえこれはテストできません。 void *は、何か(あるいは何もない)を格納できるメモリアドレスです。これは、実装が完全に依存することを意味し、元のプログラマー(またはドキュメント)のみが知っています。

0

NSStringをvoid *型にキャストすると、すべての型情報を捨てて、 "型なしのメモリへのポインタ"に変換するので、非実装固有の方法でこのような検出を行う方法は本当にありません。

なぜこの種の機能が必要なのかわかりませんが、2つのオブジェクトの間にある場合は、すべてのタイプ情報が保持されるため、void *ではなくidを使用してください。

この特定の例では、「ログ」にオーバーロードされた関数を作成するだけで、パラメータのコンパイル時の型を知ることができます。

+0

_object_へのポインタを持っているならば、ポインタそのもののタイプにかかわらず、( '-class'、' -isKindOfClass: '、' -isMemberOfClass: ')メッセージを送ることでクラスを見つけることができます。 1つは実行時情報、もう1つはコンパイル時です。 –

+0

@ JoshCaswell本当ですが、それらがすべてオブジェクトであることが確かであれば、IDよりも「低い」タイプにキャストする理由はわかりません。 void *にキャストすると、オブジェクトを扱っている情報を多かれ少なかれ捨てることになります。 –

+0

あなたは正しいです、それを行う理由はほとんどありません.2番目の段落は一般的には良いアドバイスですが、例えば、最近、 'NSInvocation'とlibffiで悩んでいました。両方とも' void * '時々。他のCスタイルのインターフェイスでも同じことが必要な場合があります。 –

関連する問題