Objective-C++中的字符串

3

我刚刚将我的代码从Objective-C转换为Objective-C++。一切都进行得非常顺利,只有两行代码出了问题。

NSString * text1=[[NSString stringWithFormat:@"%.2f",ymax] UTF8String];

这行代码抱怨说:
error: cannot convert 'const char*' to 'NSString*' in initialization

第二个与第一个相关的错误来自以下行:
CGContextShowTextAtPoint(context, 2, 8, text1, strlen(text1));

它抱怨说:
error: cannot convert 'NSString*' to 'const char*' for argument '1' to 'size_t strlen(const char*)'

有没有什么关于ObjC和ObjC++之间的差异我忽略了的?
3个回答

7

您想要:

const char * text1 = [[NSString stringWithFormat:@"%.2f", ymax] UTF8String];

注意:

NSString *text1 = [[NSString stringWithFormat:@"%.2f", ymax] UTF8String];

请注意-UTF8String方法的返回值。


谢谢。那解决了我的问题,但是为什么NSString在Obj-C中能够使用? - John Smith
3
可能是因为C语言中对指针转换的要求比较宽松。毕竟,NSString * 是一个指针,而 char * 也是一个指针,因此它们可以无警告地相互转换。这就是C++被发明的原因,它可以进行静态类型检查。 - Seva Alekseyev
这个转换需要加上 try catch 吗? - vkg

2
但您是否知道,您也可以直接告诉NSString自己绘制,像这样:
NSString *text = [NSString stringWithFormat:@"%.2f", ymax];

//  Send a message to the string to draw itself at the given point with
//  the provided font.
//
[text drawAtPoint:CGPointMake(20.0, 30.0)
         withFont:[UIFont systemFontOfSize:36.0]];

1

你不能将 char *(UTF8String 返回的类型)分配给 NSString *。这在一般情况下是正确的;然而,C++ 编译器显然更加严格。看起来你的代码只是侥幸编译通过了;你需要将 UTF8String 的部分移动到下一个语句中:CGContextShowTextAtPoint(context, 2, 8, text1, strlen([text1 UTF8String]));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接