Есть ли способ подавления предупреждений в Xcode? - PullRequest
112 голосов
/ 12 октября 2008

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

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

Ответы [ 9 ]

140 голосов
/ 13 октября 2008

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

#pragma GCC diagnostic ignored "-Wwarning-flag"

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

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

48 голосов
/ 03 ноября 2011

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

#pragma unused(varname)

EDIT: Источник: http://www.cocoadev.com/index.pl?XCodePragmas

UPDATE: Я нашел новое решение, более надежное

  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

32 голосов
/ 06 сентября 2014

Для 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
25 голосов
/ 19 октября 2010

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

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

-Wno-

, например

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

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

, например

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

5 голосов
/ 26 сентября 2009

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

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

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

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

4 голосов
/ 05 июля 2013

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

4 голосов
/ 10 ноября 2008

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

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

3 голосов
/ 13 июня 2010

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

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

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

1 голос
/ 15 октября 2008

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

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

[foo doSomethingWithFloat: 1.0];

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

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

...