Как я могу избавиться от предупреждения "неиспользуемой переменной" в XCode? - PullRequest
90 голосов
/ 27 марта 2011

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

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

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

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

Ответы [ 10 ]

101 голосов
/ 27 марта 2011

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

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

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

BOOL saved = NO;
saved = [moc save:&error];
99 голосов
/ 14 мая 2012

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

BOOL saved __unused;
35 голосов
/ 27 марта 2011

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

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

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

21 голосов
/ 21 августа 2012
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

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

14 голосов
/ 19 февраля 2014

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

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

Вы можете быть довольны уже описанными расширениями, специфичными для компилятора.

8 голосов
/ 04 августа 2017
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

ИСТОЧНИК

8 голосов
/ 28 февраля 2014

попробуй с: __unused атрибутом. Работает в Xcode 5

4 голосов
/ 11 июня 2014

Вы можете установить «Нет» Предупреждение компилятора LLVM 2.0 при «Выпуске» enter image description here

3 голосов
/ 30 марта 2017

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

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

(void)[moc save:&error];

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

1 голос
/ 22 июня 2016

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

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
...