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

119

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

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

kdbdallas
источник
да, иногда вам нужно сказать компилятору, чтобы он не предупреждал вас о неиспользуемой переменной (по его словам), но на самом деле вы можете использовать ее как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

Ответы:

145

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

#pragma GCC diagnostic ignored "-Wwarning-flag"

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

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

robottobor
источник
Спасибо ! Именно то, что мне нужно!
Moszi
28
Простой способ получить код предупреждения: перейдите в навигатор журнала (Command + 7), выберите самую верхнюю сборку, разверните журнал (кнопка «=» справа) и прокрутите вниз.
Нил Эхардт
1
Для тех, кому не все равно, образовательный справочник по вариантам предупреждений GCC: gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Леви,
2
Вроде #pragma GCC diagnostic ignored "-Wwarning-flag"уже удалено
allenlinli 06
1
@allenlinli его до сих пор там, вам просто нужно заменить warning-flagодну из предупреждений , перечисленных в gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Fonix
49

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

#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.

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

thesummersign
источник
31
Еще проще поставить __unused перед объявлением переменной.
Марк Леонард,
@ mark-leonard должен был быть отдельным ответом, я искал это несколько дней. Мне пришлось начать читать комментарии от отчаяния. Спасибо.
Repose
35

Для 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
Индер Кумар Ратор
источник
4
Clang поддерживает прагму GCC для совместимости с существующим исходным кодом. Итак, вам просто нужно написать прагму формата gcc.
Аллен
1
Начиная с Xcode 5.0, Clang был единственным предоставленным компилятором. Так что теперь вы можете использовать прагму формата clang.
allenlinli 06
27

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

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

-Wno-

например

-Wno-неиспользованный-параметр

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

например

Предупреждать всякий раз, когда параметр функции не используется, за исключением его объявления. [GCC_WARN_UNUSED_PARAMETER, -Wunused-параметр]

AndersK
источник
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

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

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

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

Марк А. Донохью
источник
1

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

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

[foo doSomethingWithFloat: 1.0];

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

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

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