Чи є спосіб придушити попередження в Xcode?


119

Чи є спосіб придушити попередження в Xcode?

Наприклад, я викликаю незадокументований метод, і оскільки метод відсутній у заголовку, я отримую попередження про компіляцію. Я знаю, що можу додати його до свого заголовка, щоб зупинити попередження, але мені цікаво, чи є інший спосіб, крім додавання його до заголовка (щоб я міг підтримувати заголовки чистими та стандартними), щоб придушити попередження? Прагма чи щось таке?


так, іноді вам потрібно сказати компілятору не попереджати вас про будь-яку невикористану змінну (за його словами), але насправді ви можете використовувати її якBOOL ok = [[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&d interval:NULL forDate:self]; NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);
thesmersmersign

Відповіді:


145

Щоб вимкнути попередження на основі файлів, використовуючи Xcode 3 та llvm-gcc-4.2, ви можете використовувати:

#pragma GCC diagnostic ignored "-Wwarning-flag"

Де назва попередження - деякий прапор попередження gcc.

Це перекриває будь-які попереджувальні прапори в командному рядку. Однак це не працює з усіма попередженнями. Додайте опцію -fdiagnostics-show-до своїх CFLAGS, і ви можете побачити, який прапор можна використовувати для відключення цього попередження.


Дякую ! Саме те, що мені було потрібно!
Моссі

28
Простий спосіб отримати код попередження: перейдіть до Навігатора журналу (Command + 7), виберіть верхню збірку, розгорніть журнал (кнопка '=' праворуч) та прокрутіть донизу.
Ніл Ехардт

1
Для тих, хто турбується, навчальна довідка щодо попереджувальних варіантів GCC: gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Levi

2
Здається #pragma GCC diagnostic ignored "-Wwarning-flag", знято вже
allenlinli

1
@allenlinli його все ще є, вам просто потрібно замінити warning-flagодне з попереджень, перелічених у gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Fonix

49

є більш простий спосіб придушити невикористані попередження змінної :

#pragma unused(varname)

EDIT: джерело: http://www.cocoadev.com/index.pl?XCodePragmas

ОНОВЛЕННЯ: Я зіткнувся з новим рішенням, більш надійним

  1. Відкрийте проект> Редагувати активну ціль> вкладку Збірка.
  2. Під User-Defined: знайдіть (або створіть, якщо його не знайдете) ключ: GCC_WARN_UNUSED_VARIABLEвстановіть його NO.

Приклад EDIT-2:

BOOL ok = YES;
NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);

компілятор показує невикористане попередження змінної для ok.

Рішення:

BOOL ok = YES;
#pragma unused(ok)
NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);

PS: Ви також можете встановити / скинути інше попередження GCC_WARN_ABOUT_RETURN_TYPE::YES/NO


31
Ще простіше - поставити __unuse перед оголошенням змінної.
Марк Леонард

@ mark-leonard мала бути окремою відповіддю, я це шукав цілими днями. Мені довелося почати читати коментарі відчайдушно. Дякую.
Відпочити

35

Для gcc можна використовувати

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow-ivar"
// your code
#pragma GCC diagnostic pop

Ви можете дізнатися про прагму GCC тут, і щоб отримати код попередження попередження, перейдіть до Навігатора звітів (Command + 9), виберіть верхню версію складання, розгорніть журнал (кнопка '=' праворуч) та перейдіть до знизу, а ваш попереджувальний код знаходиться в квадратних дужках, як це[-Wshadow-ivar]

Для клангу можна використовувати

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow-ivar"
// your code
#pragma clang diagnostic pop

4
Clang підтримує прагму GCC щодо сумісності з існуючим вихідним кодом. Тому вам просто потрібно написати прагму формату gcc.
Аллен

1
Починаючи з Xcode 5.0, Clang був єдиним наданим компілятором. Тому ви можете не використовувати прагму формату кланг зараз.
allenlinli

27

Для придушення попередження для окремого файлу виконайте наступне:

виберіть файл у проекті xcode. натисніть отримати інформацію, перейдіть на сторінку з параметрами збірки, введіть -Wno-, щоб скасувати попередження:

-Wno-

напр

-Невикористаний параметр

Назву попередження ви можете отримати, якщо подивитись на налаштування проекту, подивитися на попередження GCC, розташовані внизу сторінки вкладки збірки, натиснувши на кожне попередження, воно покаже вам ім'я параметра попередження:

напр

Попереджайте, коли параметр функції не використовується, окрім його декларації. [GCC_WARN_UNUSED_PARAMETER, -використаний параметр]


2
Це відмінне рішення, коли ви включили код із бази даних коду, ви не хочете змінювати, що відбувається, щоб викликати попередження компілятора ...
Марк Бітон,

Здається, це чудовий спосіб, але будь-які ідеї, як це зробити в XCode 4
Santthosh,

2
Знайдено моє рішення тут XCode 4 stackoverflow.com/questions/6057192 / ...
Santthosh

якщо вам потрібне попередження про супресс для лише однієї проблеми, як, наприклад, моя: ...m:45:69: Incompatible pointer types sending...я відкрив пояснення збірки і знайшов це попередження: [-Wincompatible-pointer-types]я просто перейменував його на -Wno-incompatible-pointer-typesі додав у мій .mфайл як прапор ... бум більше не попереджається ... +10 якщо я міг
Нікос Караліс

5

Завдяки Objective-C ряд серйозних помилок з'являється лише як попередження. Я не тільки не відключаю попередження, я зазвичай включаю "Трактувати попередження як помилки" (-Werror).

Кожного типу попередження у вашому коді можна уникнути, якщо все робити правильно (як правило, за допомогою викидання об'єктів у потрібний тип) або оголошення прототипів, коли вони вам потрібні.


14
Хоча це гарна загальна порада, вона не відповідає на питання. Не всі попередження є критичними або серйозними; багато хто досить тривіальний. Припустимо, що потрібно використовувати сторонню бібліотеку і не може її модифікувати з будь-якої причини (застаріла база коду, код, який повинен бути пов'язаний третьою стороною, умова боса тощо). Придушення конкретних тривіальних попереджень є цілком прийнятним у цих випадках.
Пол Легато

5

Щоб позбутися попередження: спробуйте створити інтерфейс категорії для відповідного об’єкта

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

-(void) myMethod {
...
   [theObject theUndocumentedMethod];
...
}

Як сторону, я настійно раджу не застосовувати недокументовані методи у коді доставки. Інтерфейс може і зміниться, і це буде вашою виною.


Я також це роблю. Я називаю свою категорію "Приватною" і розміщую її у верхній частині файлу .m ... Це служить способом пересилання оголошень методів, які використовуються лише у файлі. Я погоджуюся, що приватний файл заголовка був би більш стандартним, але постійно дратувати між файлами щось, що дійсно повинно бути повністю (приватним) для реалізації, дратує.
Пат Німейер

Отже, виходить, що ви можете використовувати старий трюк C, щоб просто реалізувати метод, перш ніж що-небудь використовувати. Тоді ви отримали метод локального файлу. Я думаю, що це не приватно, тому інші файли, можливо, можуть надіслати повідомлення селектору, який ви визначаєте таким чином.
Марк Полі


3

Створіть новий окремий файл заголовка під назвою "Недокументований.h" та додайте його до свого проекту. Потім створіть один блок інтерфейсів для кожного класу, на який потрібно викликати незадокументовані функції, і кожному дайте категорію «(Недокументоване)». Потім просто включіть цей один заголовочний файл у вашу ПКН. Таким чином, ваші оригінальні файли заголовків залишаються чистими, зберігається лише один інший файл, і ви можете прокоментувати один рядок у вашому ПК, щоб знову включити всі попередження.

Я також використовую цей метод для амортизованих функцій у "Амортизовані.h" з категорією "(Знос").

найкраще - ви можете вибірково включати / відключати окремі попередження, коментуючи або коментуючи окремі прототипи.


1

Придушення цього особливого попередження не є безпечним. Компілятору необхідно знати типи аргументів і повертається до методу для створення правильного коду.

Наприклад, якщо ви викликаєте такий метод

[foo doSomethingWithFloat: 1.0];

що займає поплавок, а прототипу не видно, тоді компілятор здогадається, що метод займає подвійний, а не поплавковий. Це може спричинити збої та неправильно інтерпретовані значення. У наведеному вище прикладі на такій маленькій ендіанській машині, як машини Intel, метод приймача бачив би 0 пройдених, а не 1.

Ви можете прочитати, чому в документах i386 ABI або просто виправити свої попередження. :-)


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