【问题标题】:Casting C++ types with ARC in objective-c在 Objective-C 中使用 ARC 转换 C++ 类型
【发布时间】:2013-11-11 08:02:13
【问题描述】:

偶然发现以下情况:

我使用 3-rd 方 C++ 库。

lib 的头文件:

#define lib_fname               char 
typedef lib_fname*              lib_l_fname;

Function(lib_l_fname name);

我的代码(我需要调用那个函数):

Function ((lib_l_fname)[@"name" UTF8String]);

这在非 ARC 项目中有效,但在 ARC 中我有一个错误 - “ARC 不允许将 Objective-C 指针转换为 lib_l_fname (aka char*)”

我试过了

  Function ([@"name" UTF8String]);

但它没有用。有解决办法吗?

【问题讨论】:

  • 没有找到任何有用的东西,很遗憾
  • 您需要先复制它(使用strcpy),因为该函数返回NSString 对象的内部指针。我不知道为什么它会特别导致这个错误,但如果你这样做,它可能会消失(无论如何你都需要这样做)。
  • 我没有遇到这样的问题。我使用 LLVM 5.0 编译器。它编译时没有错误和警告。 UTF8String 方法返回指向 C 字符串的指针,因此复制不应该改变任何东西。
  • Function ((lib_l_fname)@"name" ) 会导致上述编译器错误,但不会导致Function ((lib_l_fname)[@"name" UTF8String])

标签: c++ ios objective-c casting


【解决方案1】:

找到解决办法:

使用 arc 编译更加严格,并且在尝试将 const char* 转换为 char* 时会出错。

解决方案是创建第二个字符串 char* 并在那里进行 strcpy [@"name" UTF8String]

 char str2[1024] = {0};
 strcpy(str2, [@"name" UTF8String]);

 Function ((lib_l_fname)str2);

按预期工作

【讨论】:

  • CFStringGetCString(CFSTR("name"),...) 呢?
  • 另外,为什么还要打扰 NSString 呢?你不能用strcpy( str2, "name")吗?
  • "name" - 只是为了明确。实际上它是一个类似于 NSString 类型的 object.filepath 的变量
  • 这种情况下,你可以考虑CFStringGetCString((__bridge CFStringRef)theNSString, ...)甚至CFStringGetCStringPtr((__bridge CFStringRef)theNSString,...)
猜你喜欢
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多