我有一个分配给字符串的sqlite字符串列.在分配之前我需要确保它不是零.我这样做:
char *isNil = sqlite3_column_text(selectstmt, 2); if(isNil != nil){ myName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];}
这给出了警告:
警告:初始化从指针目标类型中丢弃限定符
这样做的正确方法是什么?
当你忽略const时,你会得到警告.API定义如下:
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
你将返回分配给char*,所以你要删除const.这就是你得到警告的原因.你应该尊重const.
const unsigned char *isNil = ...
我不是一个非常客观的人,但我认为通过风格来比较主要类型与NULL而不是nil是常见的做法.此外,无需两次调用column_text.
const char *columnText = (const char *)sqlite3_column_text(selectstmt, 2); if(columnText != NULL) { myName = [NSString stringWithUTF8String: columnText ]; }
你可以看到上面我已经将const unsigned char指针转换为const signed char指针.当你抛弃一个警告说你是正确的事情时,你应该确定你知道.在这种情况下,可以安全地转换为签名字符.一般来说,永远不会抛弃const,因为无论是谁制作了这个API都可以做一些需要你将数据视为const的东西.