Как я могу избавиться от предупреждения “неиспользуемая переменная” в Xcode?
-
12-11-2019 - |
Вопрос
Я точно понимаю, почему возникают предупреждения о неиспользуемых переменных.Я не хочу подавлять их вообще, потому что в большинстве случаев они невероятно полезны.Однако рассмотрим следующий (надуманный) код.
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
Xcode сообщает, что saved
является неиспользуемой переменной, хотя, конечно, это не так.Я подозреваю, что это потому, что NSAssert1
это макрос.То NS_BLOCK_ASSERTIONS
макрос - это нет определено, поэтому утверждения Objective C определенно включены.
Хотя это ничему не вредит, я нахожу это неопрятным и раздражающим, и я хочу подавить это, но я не уверен, как это сделать.Присвоение переменной самой себе избавляет от предупреждения компилятора, но я бы предпочел сделать это "правильным" способом, если такая вещь существует.
Решение
Я не уверен, поддерживается ли это по-прежнему в новом компиляторе LLVM, но у GCC есть атрибут "unused", который вы можете использовать для подавления этого предупреждения:
BOOL saved __attribute__((unused)) = [moc save:&error];
В качестве альтернативы (в случае, если LLVM не поддерживает вышеуказанное), вы могли бы разделить объявление переменной на отдельную строку, гарантируя, что переменная будет "использоваться" независимо от того, расширяется макрос или нет:
BOOL saved = NO;
saved = [moc save:&error];
Другие советы
Используя Xcode 4.3.2, я обнаружил, что это, похоже, работает (меньше записей)
BOOL saved __unused;
В Xcode вы можете настроить предупреждения для "неиспользуемых переменных". Перейдите в "Настройки сборки" для целевого объекта и отфильтруйте со словом "неиспользуемые".
Вот скриншот:
Я предлагаю вам изменить его только для отладки.Таким образом, вы ничего не пропустите в своей релизной версии.
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)
Попробуй вот так.У меня это работает.Это сработает и для вас тоже.
Единственный простой и переносимый способ пометить переменную как используемую - это... использовать ее.
BOOL saved = ...;
(void)saved; // now used
Однако вы можете быть довольны уже описанными расширениями, специфичными для компилятора.
попробуйте с:__ неиспользуемый атрибут.Работает в Xcode 5
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop
Вы можете установить "Нет" Предупреждение LLVM compliler 2.0 на "Освобождении"
Именно так вы делаете это в C и, следовательно, также в Objective-C.
Даже если у вас не включены предупреждения, всегда рекомендуется пометить возвращаемое значение как явно игнорируемое.Это также показывает другим разработчикам, что вы не просто забыли о возвращаемом значении – вы действительно явно решили игнорировать его.
(void)[moc save:&error];
РЕДАКТИРОВАТЬ:Компиляторы игнорируют приведения к void
, так что это не должно влиять на производительность – это просто приятная чистая человеческая аннотация.
Пусть это займет две строки.Разделите объявление и значение по умолчанию
BOOL enabled = NO;
// ...
BOOL enabled;
enabled = NO;