Есть ли способ подавления предупреждений в Xcode?
Есть ли способ подавления предупреждений в Xcode?
Например, я вызываю недокументированный метод и, поскольку метод отсутствует в заголовке, я получаю предупреждение при компиляции. Я знаю, что могу добавить его в свой заголовок, чтобы остановить предупреждение, но мне интересно, есть ли другой способ, кроме добавления его в заголовок (чтобы я мог сохранять заголовки чистыми и стандартными), чтобы подавить предупреждение? Прагма или что-то?
9 ответов
Чтобы отключить предупреждения для каждого файла, используя Xcode 3 и llvm-gcc-4.2, вы можете использовать:
#pragma GCC diagnostic ignored "-Wwarning-flag"
Где имя предупреждения - некоторый флаг предупреждения gcc.
Это переопределяет все флаги предупреждения в командной строке. Это не работает со всеми предупреждениями, хотя. Добавьте -fdiagnostics-show-option к вашему CFLAGS, и вы увидите, какой флаг вы можете использовать, чтобы отключить это предупреждение.
Существует более простой способ подавления предупреждений о неиспользуемых переменных:
#pragma unused(varname)
РЕДАКТИРОВАТЬ: источник: http://www.cocoadev.com/index.pl?XCodePragmas
ОБНОВЛЕНИЕ: я нашел новое решение, более надежное
- Откройте вкладку "Проект"> "Изменить активную цель"> "Создать".
- Под
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
Для GCC вы можете использовать
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow-ivar"
// your code
#pragma GCC diagnostic pop
Вы можете узнать о прагме GCC здесь и получить код предупреждения о предупреждении, перейдите в Навигатор журналов (Command+7), выберите самую верхнюю сборку, разверните журнал (кнопка "=" справа) и прокрутите до снизу и там ваш код предупреждения находится в квадратных скобках, как это [-Wshadow-ivar]
Для лязга вы можете использовать
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow-ivar"
// your code
#pragma clang diagnostic pop
Чтобы исключить предупреждение для отдельного файла, сделайте следующее:
выберите файл в проекте xcode. нажмите получить информацию, перейдите на страницу с параметрами сборки введите -Wno-, чтобы отменить предупреждение:
-Wno-
например
-Wno-неиспользованный-параметр
Вы можете получить имя предупреждения, если вы посмотрите в настройках проекта, посмотрите предупреждения GCC, расположенные внизу вкладки сборки, щелкнув каждое предупреждение, оно сообщит вам имя параметра предупреждения:
например
Предупреждать всякий раз, когда параметр функции не используется, кроме его объявления. [GCC_WARN_UNUSED_PARAMETER, -Wunused-параметр]
В Objective-C ряд серьезных ошибок появляется только в виде предупреждений. Я не только никогда не отключаю предупреждения, я обычно включаю "Обрабатывать предупреждения как ошибки" (-Werror).
Любого типа предупреждений в вашем коде можно избежать, если делать все правильно (обычно путем приведения объектов к правильному типу) или объявлять прототипы, когда они вам нужны.
http://nshipster.com/pragma/ - перейти к разделу запрещающих предупреждений
Чтобы избавиться от предупреждения: попробуйте создать интерфейс категории для рассматриваемого объекта.
@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)
-(id)theUndocumentedMethod;
@end
...
@implementation myClass : mySuperclass
-(void) myMethod {
...
[theObject theUndocumentedMethod];
...
}
Кроме того, я настоятельно рекомендую не вызывать недокументированные методы в коде доставки. Интерфейс может и изменится, и это будет ваша вина.
Создайте новый отдельный заголовочный файл с именем "Undocumented.h" и добавьте его в свой проект. Затем создайте один интерфейсный блок для каждого класса, для которого вы хотите вызывать недокументированные функции, и присвойте каждой категории "(недокументированный)". Затем просто включите этот один заголовочный файл в ваш PCH. Таким образом, ваши исходные заголовочные файлы остаются чистыми, есть только один файл для обслуживания, и вы можете закомментировать одну строку в вашем PCH, чтобы снова включить все предупреждения.
Я также использую этот метод для устаревших функций в "Depreciated.h" с категорией "(Depreciated)".
Самое приятное то, что вы можете выборочно включать / отключать отдельные предупреждения, комментируя или раскомментируя отдельные прототипы.
Подавление этого конкретного предупреждения небезопасно. Компилятор должен знать типы аргументов и возвращается к методу для генерации правильного кода.
Например, если вы вызываете такой метод
[foo doSomethingWithFloat:1.0];
это занимает плавающее число, и прототип не виден, тогда компилятор будет догадываться, что метод принимает двойное число, а не число с плавающей точкой. Это может привести к сбоям и неверно интерпретированным значениям. В приведенном выше примере на машине с прямым порядком байтов, такой как машины intel, метод получателя будет видеть 0 пройдено, а не 1.
Вы можете прочитать почему в документах ABI i386, или вы можете просто исправить свои предупреждения.:-)