2009-08-05 15 views
1

Je comprends la différence entre les types unsigned char * et char *. Je comprends également comment utiliser reinterpret_cast pour lancer un unsigned char * en char * en C++.Comportement défini de conversion de char * non signé en char * dans Objective-C

J'utilise sqlite3 en Objective-C et essaie d'obtenir un NSString d'un appel à

sqlite3_column_text(...); 

Pour ce faire, je fais essentiellement:

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

sqlite3_column_text(), Cependant, renvoie un unsigned char * et je suis préoccupé par le comportement de la distribution à char *. J'ai lu que le casting est spécifique à l'implémentation et je me demandais si c'était un casting sûr en Objective-C ou si je aboyais totalement le mauvais arbre?

+0

BTW reinterpret_cast ne semble pas être disponible pour ObjC sauf si c'est dans un fichier d'en-tête que je ne connais pas - ce qui est possible. – jcb

+1

'reinterpret_cast' est un opérateur C++ non disponible en Objective-C. – notnoop

Répondre

4

Vous n'avez pas à vous soucier de la distribution. En fait, le code exemple Apple utilise le modèle même code exact que vous utilisez:

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

(De SQLite Book ListBook.m classe).

Je pense que vous devriez être plus préoccupé par la base de données ayant effectivement UTF-8 chaînes.

+0

"Je pense que vous devriez être plus préoccupé par la base de données ayant des chaînes UTF-8." Oui, l'idée de char est aujourd'hui pratiquement dépourvue de sens. Si toutes ces API et types étaient en train d'être refaits aujourd'hui, nous n'aurions probablement pas de types avec des noms trompeurs comme char au lieu de uint8_t. Tous les soucis de NSString sont les valeurs des octets pointés par la valeur de retour de sqlite3_column_text. Lancer le pointeur ne changera pas la valeur des octets. Vous pourriez lancer le pointeur vers quelque chose de redoutable comme (NSRect *), et obtenir un avertissement du compilateur, mais le code fonctionnerait toujours correctement. –