2009-08-05 15 views
1

unsigned char *char *の違いを理解しています。 reinterpret_castを使用してunsigned char *をC++のchar *にキャストする方法も分かります。Objective-Cのunsigned char *からchar *へのキャストの動作を定義

私はObjective-Cでsqlite3のを使用していますし、これを行うには

sqlite3_column_text(...); 

への呼び出しからNSStringを取得しようとしています、私は基本的にやってる:

char *cParam = (char *)sqlite3_column_text(compiledStatementPtr, 0); 
NSString *aParam = nil; 
if (cParam) { 
    aParam = [NSString stringWithUTF8String:cParam]; 
} 

sqlite3_column_text()を、しかし、unsigned char *を返すと、私はchar *へのキャストの動作が心配です。私はキャストが実装特有であることを読みました。これがObjective-Cの安全なキャストかどうか、あるいは間違ったツリーを完全に吠えているのかどうか疑問に思っていましたか?

+0

私が気付いていないヘッダーファイルでない限り、BTW reinterpret_castはObjCで利用できないようです。これは可能です。 – jcb

+1

'reinterpret_cast'はObjective-Cでは利用できないC++演算子です。 – notnoop

答えて

4

あなたはキャストのために心配する必要はありません。

self.title = 
    [NSString stringWithUTF8String:(char *)sqlite3_column_text(init_statement, 0)]; 

SQLite Book ListからBook.mクラス):実際には、アップルのサンプルコードは、使用している正確に同じコードパターンを使用しています。

実際にUTF-8文字列を持つデータベースにもっと関心があると思います。

+0

"私はあなたが実際にUTF-8文字列を持つデータベースにもっと関心を持っているべきだと思います。はい、チャーのアイデアは今日は無意味です。これらのAPIとタイプのすべてが今日でもやり直されたら、おそらくcharのような誤解を招くような名前のタイプはなく、代わりにuint8_tを持つだけです。すべてのNSStringは、sqlite3_column_textの戻り値が指すバイトの値です。ポインタをキャストしても、バイトの値は変更されません。ポインタを(NSRect *)のような微妙なものにキャストし、コンパイラの警告を得ることができますが、コードは正しく機能します。 –

関連する問題