0

我维护的一个古老代码最初是这样的:

NSUInteger readUnicode(NSMutableString *string, signed char const * buf, signed long int offset, size_t bufsize)
{   
    NSUInteger initLength = [string length];
    signed char const * start = buf + offset;
    NSLog (@"--------> start: %S", start);

    [string appendFormat:@"%S", start];
    return [string length] - initLength;
}

XCode 抛出警告“格式指定类型 'const unsigned short *' 但参数的类型为 'const signed char *' 并建议将 appendFormat:@"%S" 更改为 appendFormat:@"%s"

当我确实将 %S 更改为 %s 时,无论输入如何,我都开始在返回字符串中只得到一个字符。

因此,我将代码更改为:

NSUInteger readUnicode(NSMutableString *string, signed char const * buf, signed long int offset, size_t bufsize)
{
    NSUInteger initLength = [string length];

    const unsigned short * start = (const unsigned short * )buf + offset;
    NSLog (@"--------> start: %S", start);

    [string appendFormat:@"%S", start];
    return [string length] - initLength;
}

......现在我似乎得到了所有的角色并且没有警告。这是处理警告的方法吗?或者也许我可以/应该做点别的事情?(除了改变输入buf的类型)

谢谢你。

4

1 回答 1

0

这是处理警告的方法吗?

也许不完全是。如果您使用宽字符串,为什么不声明您的函数这样做呢?

NSUInteger readUnicode(NSMutableString *string, unichar const *buf, signed long int offset, size_t bufsize)
                                                ^^^^^^^
                                       Note the use of "unichar"!

然后你就不需要丑陋的演员表,你不会收到警告,你的程序也不会调用未定义的行为。

于 2013-02-01T20:06:17.693 回答