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

Ответы:


145

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

#pragma GCC diagnostic ignored "-Wwarning-flag"

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

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


Спасибо ! Именно то, что мне нужно!
— 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


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-параметр]


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
Хороший совет, но на самом деле не отвечает на вопрос, как указано выше.
— Пол Легато,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.