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


98

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

NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);

Xcode сообщает, что savedэто неиспользуемая переменная, хотя, конечно, это не так. Я подозреваю, что это потому, что NSAssert1это макрос. NS_BLOCK_ASSERTIONSМакрос не определен, поэтому Объективные утверждения C определенно включены.

Хотя это ничего не повредит, мне это кажется неопрятным и раздражающим, и я хочу подавить это, но я не знаю, как это сделать. Присвоение переменной самой себе избавляет от предупреждения компилятора, но я бы предпочел сделать это «правильным» способом, если такая вещь существует.

Ответы:


107

Я не уверен, поддерживается ли он по-прежнему в новом компиляторе LLVM, но у GCC есть атрибут «неиспользуемый», который можно использовать для подавления этого предупреждения:

BOOL saved __attribute__((unused)) = [moc save:&error];

В качестве альтернативы (в случае, если LLVM не поддерживает вышеуказанное), вы можете разделить объявление переменной в отдельную строку, гарантируя, что переменная будет «использоваться» независимо от того, будет ли макрос расширяться или нет:

BOOL saved = NO;
saved = [moc save:&error];

107

Используя Xcode 4.3.2 и обнаружил, что это работает (меньше написания)

BOOL saved __unused;

У меня это не работает, я получаю предупреждение, что'saved' was marked as unused but was used
Heath Borders

37

В Xcode вы можете установить предупреждения для «Неиспользуемых переменных». Перейдите в «Настройки сборки» для цели и отфильтруйте слово «неиспользованный»

Вот скриншот: Скриншот настроек сборки

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


37
Вы пропустили ту часть вопроса, где Грегори сказал: «Я не хочу подавлять их вообще, потому что они невероятно полезны в большинстве случаев»?
Шерм Пендли,

8
@ShermPendley Несмотря на это, это все еще полезно, он ответил на мой вопрос о том, как отключить его глобально.
raffian

9
отключение предупреждений - отличный способ пропустить ошибки. Я настоятельно не рекомендую.
orion elenzil

2
@orionelenzil - ну и да, и нет. Это настоящая проблема интерфейса с ложными срабатываниями. Предупреждение появляется постоянно, пока вы пишете код, если вы не добрались до той части кода, в которой используете переменную. Со временем это научит вас игнорировать предупреждение, а значит, вы вполне можете пропустить более важные ошибки. Лучше бы иметь возможность подавлять ошибку в активно редактируемых блоках кода.
TechZen

Привет, все работает нормально, если я установил НЕТ. но я сомневаюсь: мне нужно установить Debug & Release NO ya only Unused Variable: NO? какой я должен установить. Если я установлю Totally NO, тогда это не создаст никаких проблем во время выпуска na?
SR Nayak

22
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

Попробуйте вот так. У меня это работает. Это сработает и для вас.


У меня это не работает, я получаю предупреждение, что'saved' was marked as unused but was used
Heath Borders

15

Единственный простой и переносимый способ пометить переменную как используемую - это… использовать ее.

BOOL saved = ...;
(void)saved; // now used

Однако вы можете быть довольны уже описанными расширениями для конкретного компилятора.


2
Я предпочитаю это уродливой #pragma, описанной выше.
northernman

1
Привет, братан, хороший совет
dimazava

14
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

ИСТОЧНИК


Это наиболее чистый подход, поскольку он отключает только предупреждение между этими #pragmas
cornr


5

Вы можете установить предупреждение компилятора LLVM 2.0 "Нет" в "Выпуск"введите описание изображения здесь


4

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

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

(void)[moc save:&error];

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


В определенных контекстах вы ДОЛЖНЫ использовать этот прием для компиляции кода Objective-C. Использование (void)- самый простой способ, спасибо!
Дэн Розенстарк

1

Сделайте так, чтобы он занимал две строчки. Разделите декларацию и значение по умолчанию

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.