Як я можу позбутися попередження про "невикористану змінну" в 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
Хіт Межі

37

У Xcode ви можете встановити попередження для "Невикористаних змінних". Перейдіть до "Налаштування побудови" для цілі та відфільтруйте слово "невикористаний"

Ось скріншот: Скріншот налаштувань Builld

Я пропоную вам змінити його лише для налагодження. Таким чином, ви не пропустите нічого у своїй версії.


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

8
@ShermPendley Незважаючи на те, що це все ще корисно, він відповів на моє запитання про те, як вимкнути це в усьому світі.
raffian

9
вимкнення попереджень - прекрасний спосіб пропустити помилки. Дуже рекомендую проти.
orion elenzil

2
@orionelenzil - ну так і ні. Існує реальна проблема інтерфейсу з помилковими позитивами. Попередження постійно з’являється під час написання коду, якщо ви не потрапили до тієї частини коду, де використовуєте змінну. З часом це навчить вас ігнорувати попередження, тобто ви можете пропустити більш важливі помилки. Краще було б можливість придушити помилку в блоках коду, що активно редагується.
TechZen

Привіт, його добре працює, якщо я встановив "НІ". але я сумніваюсь: я повинен встановити «Налагодження та випуск» НЕ я лише невикористану змінну: НІ? яку я маю встановити. Якщо я встановив Всього НІ, то його не створити жодної проблеми під час випуску 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.
північ

1
Привіт
брато

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

ДЖЕРЕЛО


Це найчистіший підхід, оскільки він відключає лише попередження між цими #прагмами
cornr


5

Ви можете встановити "Ні" LLVM compliler 2.0 попередження на "Release"введіть тут опис зображення


4

Це так, як ви це робите в C, а отже і Objective-C.

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

(void)[moc save:&error];

EDIT: Компілятори ігнорують закиди void, тому це не повинно впливати на продуктивність - це просто приємна чиста людська примітка.


У певних контекстах ОБОВ'ЯЗКОВО використовувати цей злом, щоб отримати код Objective-C для компіляції. Використовуючи (void)це найяскравіший шлях, спасибі!
Дан Розенстарк

1

Зробіть, щоб вона займала дві лінії. Відокремте значення декларації та значення за замовчуванням

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.