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 に変更すると、入力に関係なく、戻り文字列に 1 文字しか表示されなくなりました。

代わりに、コードを次のように変更しました。

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 に答える