%lu и%u оба дают мне предупреждения....

Привет, я получаю это предупреждение при использовании%lu:

msgstr "формат указывает тип unsigned long, но аргумент имеет тип unsigned int."

затем, когда я заменяю%u: предупреждение меняется на:

msgstr "формат указывает тип unsigned int, но аргумент имеет тип unsigned long."

вот мой код:

NSString *viewName_ = [NSString stringWithFormat:@"myGreatView%lu", currentTagLoadedOnView-99];

где currentTagLoadedOnView:

NSUInteger currentTagLoadedOnView;

любая помощь очень ценится....

2 ответа

Решение

Попробуйте любой из следующих

1) Используйте оба как unsigned int

NSString *viewName_ = [NSString stringWithFormat:@"myGreatView%u", currentTagLoadedOnView-99];

и объявить currentTagLoadedOnView как NSUInteger currentTagLoadedOnView;

2) тип приведен к беззнаковому длинному

NSString *viewName_ = [NSString stringWithFormat:@"myGreatView%lu", (unsigned long) currentTagLoadedOnView-99];

и объявить currentTagLoadedOnView как NSUInteger currentTagLoadedOnView;

3) Определяется незапятнанным, поскольку оба

NSString *viewName_ = [NSString stringWithFormat:@"myGreatView%lu", (unsigned long) currentTagLoadedOnView-99];

и объявить currentTagLoadedOnView как unsigned long currentTagLoadedOnView;

Примечание. Ваше предупреждение исчезнет, ​​если вы используете только 64-битную архитектуру (вносите изменения в согласованный тип данных) или только 32-битную (без изменений). Если вы используете Standard architecture(including 64-bit)Даст это предупреждение.

Фактический тип NSUInteger отличается в зависимости от того, используете ли вы 32-битную или 64-битную версию. Поэтому, независимо от формата, который вы используете, вы получите предупреждение, как в 32-битной сборке, так и в 64-битной сборке. Решение довольно просто:

NSString *viewName_ = [NSString stringWithFormat:@"myGreatView%lu", (unsigned long) (currentTagLoadedOnView-99)];

NSUInteger может быть приведен к unsigned long без потери информации, как на 32-битных, так и на 64-битных системах.

Другие вопросы по тегам