【问题标题】:Defined behavior of cast from unsigned char * to char * in Objective-C在 Objective-C 中从 unsigned char * 到 char * 的定义行为
【发布时间】:2010-11-17 03:30:47
【问题描述】:

我了解unsigned char *char * 类型之间的区别。我也了解如何在 C++ 中使用 reinterpret_cast 将 unsigned char * 转换为 char *

我在 Objective-C 中使用 sqlite3 并试图从调用中获取 NSString

sqlite3_column_text(...);

要做到这一点,我基本上是在做:

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 中的安全演员表,或者我是否完全在错误的树上吠叫?

【问题讨论】:

  • BTW reinterpret_cast 似乎对 ObjC 不可用,除非它在我不知道的头文件中——这是可能的。
  • reinterpret_cast 是 Objective-C 中不可用的 C++ 运算符。

标签: objective-c casting sqlite char unsigned


【解决方案1】:

由于演员阵容,您不必担心太多。实际上,Apple 示例代码使用的代码模式与您使用的完全相同:

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

(来自SQLite Book ListBook.m类)。

我认为您应该更关心实际上具有UTF-8 字符串的数据库。

【讨论】:

  • “我认为您应该更关心数据库实际上是否具有 UTF-8 字符串。”是的,char 的概念在今天几乎毫无意义。如果今天重做所有这些 API 和类型,我们可能不会有像 char 这样具有误导性名称的类型,而是只有 uint8_t。所有 NSString 关心的是 sqlite3_column_text 的返回值所指向的字节的值。转换指针不会改变字节的值。您可以将指针强制转换为 (NSRect *) 之类的可笑对象,并获得编译器警告,但代码仍然可以正常运行。
猜你喜欢
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
相关资源
最近更新 更多