Есть ли способ подавить предупреждения в Xcode?

Есть ли способ подавить предупреждения в 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);

thesummersign 05.04.2012 15:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
120
1
82 900
9

Ответы 9

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

#pragma GCC diagnostic ignored "-Wwarning-flag"

Где имя предупреждения - это флаг предупреждения gcc.

Это отменяет любые предупреждающие флаги в командной строке. Однако это работает не со всеми предупреждениями. Добавьте -fdiagnostics-show-option в свой CFLAGS, и вы увидите, какой флаг можно использовать для отключения этого предупреждения.

Спасибо ! Именно то, что мне нужно!

Moszi 28.01.2011 15:30

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

Neal Ehardt 25.01.2012 20:46

Для тех, кому не все равно, образовательный справочник по параметрам предупреждений GCC: gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

Levi 18.08.2015 23:56

Вроде #pragma GCC diagnostic ignored "-Wwarning-flag" уже удален

allenlinli 06.12.2019 04:44

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

Fonix 10.06.2020 12:01

Подавление этого конкретного предупреждения небезопасно. Компилятору необходимо знать типы аргументов и возвращаться к методу для генерации правильного кода.

Например, если вы вызываете такой метод

[foo doSomethingWithFloat: 1.0];

который принимает значение с плавающей запятой, а прототипа не видно, компилятор угадает, что метод принимает значение типа double, а не число с плавающей точкой. Это может вызвать сбои и неправильную интерпретацию значений. В приведенном выше примере на машине с прямым порядком байтов, такой как машины Intel, метод получателя будет видеть, что передано 0, а не 1.

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

Хороший совет, но на самом деле не отвечает на вопрос, как указано выше.

Paul Legato 24.10.2011 09:56

В Objective-C ряд серьезных ошибок появляется только как предупреждения. Я не только отключаю предупреждения никогда, я обычно включаю «Обрабатывать предупреждения как ошибки» (-Werror).

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

Хотя это хороший общий совет, он не отвечает на вопрос. Не все предупреждения являются критическими или серьезными; многие довольно банальны. Предположим, что требуется использовать стороннюю библиотеку и не может ее изменять по какой-либо причине (устаревшая кодовая база, код, предназначенный для связывания третьей стороной, постановление начальника и т. д.). В этих случаях вполне приемлемо подавление конкретных тривиальных предупреждений.

Paul Legato 24.10.2011 09:54

Чтобы избавиться от предупреждения: попробуйте создать интерфейс категории для рассматриваемого объекта.

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

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

Кстати, я сильно не советую вызывать недокументированные методы в коде доставки. Интерфейс может и будет меняться, и это будет ваша вина.

Я тоже так делаю. Я называю свою категорию «Частный» и помещаю ее в начало файла .m ... Она служит способом пересылки объявления методов, которые используются только внутри файла. Я согласен с тем, что частный файл заголовка был бы более стандартным, но необходимость постоянно переключаться между файлами для чего-то, что действительно должно быть полностью закрытым (частным) для реализации, раздражает.

Pat Niemeyer 25.07.2010 21:34

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

Mark Pauley 25.06.2011 01:43

Создайте новый отдельный файл заголовка с именем «Undocumented.h» и добавьте его в свой проект. Затем создайте один блок интерфейса для каждого класса, для которого вы хотите вызвать недокументированные функции, и присвойте каждому категорию «(Недокументированный)». Затем просто включите этот файл заголовка в свой PCH. Таким образом, ваши исходные файлы заголовков остаются чистыми, остается только один файл, который нужно поддерживать, и вы можете закомментировать одну строку в своем PCH, чтобы снова включить все предупреждения.

Я также использую этот метод для устаревших функций в 'Depreciated.h' с категорией '(Depreciated)'.

Самое приятное то, что вы можете выборочно включать / отключать отдельные предупреждения, комментируя или раскомментируя отдельные прототипы.

Чтобы скрыть предупреждение для отдельного файла, сделайте следующее:

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

-Wno-

например

-Wno-unused-parameter

Вы можете получить имя предупреждения, если посмотрите настройки проекта и посмотрите предупреждения GCC, расположенные в нижней части страницы вкладки сборки, щелкнув каждое предупреждение, оно сообщит вам имя параметра предупреждения:

например

Warn whenever a function parameter is unused aside from its declaration. [GCC_WARN_UNUSED_PARAMETER, -Wunused-parameter]

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

Mark Beaton 09.04.2011 08:32

Похоже, отличный способ, но есть идеи, как это сделать в XCode 4

Santthosh 20.06.2011 20:50

Нашел здесь свое решение для XCode 4 stackoverflow.com/questions/6057192/…

Santthosh 20.06.2011 20:57

если вам нужно предупреждение о подавлении только для одной проблемы, как у меня: ...m:45:69: Incompatible pointer types sending..., я открыл описание сборки и нашел это предупреждение: [-Wincompatible-pointer-types], я просто переименовал его в -Wno-incompatible-pointer-types и добавил в качестве флага в свой файл .m ... бум больше никаких предупреждений .. +10, если бы я мог

Nicos Karalis 09.10.2012 02:09

есть более простой способ подавить предупреждения Неиспользуемая переменная:

#pragma unused(varname)

Обновлено: источник: http://www.cocoadev.com/index.pl?XCodePragmas

ОБНОВИТЬ: Я нашел новое решение, более надежное

  1. Откройте Project> Edit Active Target> Build tab.
  2. В User-Defined: найдите (или создайте, если вы его не найдете) ключ: GCC_WARN_UNUSED_VARIABLE установите для него NO.

РЕДАКТИРОВАТЬ-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

Еще проще поставить __unused перед объявлением переменной.

Mark Leonard 15.02.2012 01:03

@ mark-leonard должен был быть отдельным ответом, я искал это несколько дней. Мне пришлось начать читать комментарии от отчаяния. Спасибо.

Repose 15.11.2018 22:20

http://nshipster.com/pragma/#inhibiting-warnings - перейти к разделу запрещающих предупреждений

Для gcc вы можете использовать

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

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

Для clang вы можете использовать

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

Clang поддерживает прагму GCC для совместимости с существующим исходным кодом. Итак, вам просто нужно написать прагму формата gcc.

Allen 10.12.2014 06:01

Начиная с Xcode 5.0, Clang был единственным предоставленным компилятором. Так что теперь вам может потребоваться использовать прагму формата clang.

allenlinli 06.12.2019 12:49

Другие вопросы по теме