%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-битных системах.