2009-08-05 17 views
1

Ich verstehe den Unterschied zwischen unsigned char * und char * Arten. Ich verstehe auch, wie man reinterpret_cast benutzt, um eine unsigned char * zu einer char * in C++ zu werfen.Definiertes Verhalten von Cast von unsigned char * zu char * in Objective-C

Ich benutze sqlite3 in Objective-C und ich versuche, eine NSString von einem Aufruf

sqlite3_column_text(...); 

zu bekommen dies zu tun, ich bin im Grunde tun:

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

sqlite3_column_text(), gibt jedoch eine unsigned char * zurück und ich bin besorgt über das Verhalten der Besetzung zu char *. Ich habe gelesen, dass die Besetzung umsetzungsspezifisch ist und ich mich gefragt habe, ob dies eine sichere Besetzung in Objective-C ist oder ob ich den falschen Baum belle.

+0

BTW reinterpret_cast scheint nicht zu ObjC verfügbar, es sei denn, es ist in einer Header-Datei ich nicht bewusst - was möglich ist. – jcb

+1

'reininterpret_cast' ist ein C++ - Operator, der in Objective-C nicht verfügbar ist. – notnoop

Antwort

4

Sie haben wegen der Besetzung nicht viel zu befürchten. Eigentlich verwendet Apple-Beispielcode genau die gleiche Codemuster Sie verwenden:

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

(Von SQLite Book ListBook.m Klasse).

Ich denke, Sie sollten mehr mit der Datenbank betroffen sein, die tatsächlich UTF-8 Strings hat.

+0

"Ich denke, Sie sollten sich mehr mit der Datenbank befassen, die tatsächlich UTF-8-Strings hat." Ja, die Idee von Saibling ist heutzutage praktisch unwichtig. Wenn all diese APIs und Typen heute überarbeitet würden, hätten wir wahrscheinlich keine Typen mit irreführenden Namen wie char anstelle von uint8_t. Alles was NSString interessiert, sind die Werte der Bytes, auf die der Rückgabewert von sqlite3_column_text zeigt. Durch das Umsetzen des Zeigers wird der Wert der Bytes nicht geändert. Sie könnten den Zeiger auf etwas Redliches wie (NSRect *) setzen und eine Compilerwarnung erhalten, aber der Code würde immer noch korrekt funktionieren. –