Как я могу избавиться от предупреждения “неиспользуемая переменная” в Xcode?

StackOverflow https://stackoverflow.com/questions/5451123

Вопрос

Я точно понимаю, почему возникают предупреждения о неиспользуемых переменных.Я не хочу подавлять их вообще, потому что в большинстве случаев они невероятно полезны.Однако рассмотрим следующий (надуманный) код.

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 вы можете настроить предупреждения для "неиспользуемых переменных". Перейдите в "Настройки сборки" для целевого объекта и отфильтруйте со словом "неиспользуемые".

Вот скриншот: Builld Settings Screenshot

Я предлагаю вам изменить его только для отладки.Таким образом, вы ничего не пропустите в своей релизной версии.

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 на "Освобождении" enter image description here

Именно так вы делаете это в C и, следовательно, также в Objective-C.

Даже если у вас не включены предупреждения, всегда рекомендуется пометить возвращаемое значение как явно игнорируемое.Это также показывает другим разработчикам, что вы не просто забыли о возвращаемом значении – вы действительно явно решили игнорировать его.

(void)[moc save:&error];

РЕДАКТИРОВАТЬ:Компиляторы игнорируют приведения к void, так что это не должно влиять на производительность – это просто приятная чистая человеческая аннотация.

Пусть это займет две строки.Разделите объявление и значение по умолчанию

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top